1 条题解
-
0
C++ :
#include <iostream> using namespace std; #define MAXN 100 struct TSegment { double x1, y1, x2, y2; double a, b, c; bool del; } s[MAXN]; int n, m; int res(double x, double y) { for (int i = 0; i < n; i++) s[i].del = 0; while (1) { double ymax = 0; int _k; for (int k = 0; k < n; k++) if (!s[k].del && (x - s[k].x1) * (s[k].x2 - x) >= 0) { double y0 = (-s[k].c - s[k].a * x) / s[k].b; if (y0 <= y && y0 >= ymax) ymax = y0, _k = k; } if (ymax == 0) break; if (s[_k].y1 <= s[_k].y2) x = s[_k].x1, y = s[_k].y1; else x = s[_k].x2, y = s[_k].y2; s[_k].del = 1; } return (int)x; } int main() { while (cin >> n) { //cin >> n; for (int i = 0; i < n; i++) { cin >> s[i].x1 >> s[i].y1 >> s[i].x2 >> s[i].y2; s[i].a = s[i].y2 - s[i].y1; s[i].b = s[i].x1 - s[i].x2; s[i].c = s[i].x2 * s[i].y1 - s[i].x1 * s[i].y2; } cin >> m; for (int i = 0; i < m; i++) { double x, y; cin >> x >> y; cout << res(x, y) << endl; } } return 0; }
Java :
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int num = in.nextInt(); int[][] arr = new int[num][4]; for (int i = 0; i < num; i++) for (int j = 0; j < 4; j++) arr[i][j] = in.nextInt(); int rain = in.nextInt(); int[][] rainArr = new int[rain][2]; for (int i = 0; i < rain; i++) for (int j = 0; j < 2; j++) rainArr[i][j] = in.nextInt(); boolean[] visited = new boolean[num]; double[] k = new double[num]; double[] b = new double[num]; for (int i = 0; i < num; i++) { k[i] = (arr[i][3] - arr[i][1]) * 1.0 / (arr[i][2] - arr[i][0]); b[i] = arr[i][1] - k[i] * arr[i][0]; } for (int i = 0; i < rain; i++) { for (int j = 0; j < num; j++) { visited[j] = false; } int currentX = rainArr[i][0]; double currentY = rainArr[i][1]; for (int jj = 0; jj < num; jj++) { double testY, maxY = -1; int currentNum = -1, lowYIndex = -1; for (int j = 0; j < num; j++) { if (!visited[j]) { testY = k[j] * currentX + b[j]; if ((testY <= currentY && testY > maxY)&& ((currentX >= arr[j][0] && currentX <= arr[j][2]) || (currentX <= arr[j][0] && currentX >= arr[j][2]))) { maxY = testY; currentNum = j; if (arr[j][1] < arr[j][3]) lowYIndex = 1; else lowYIndex = 3; } } } if (-1 == currentNum) { break; } visited[currentNum] = true; currentX = arr[currentNum][lowYIndex - 1]; currentY = arr[currentNum][lowYIndex]; } System.out.println(currentX); } } } }
- 1
信息
- ID
- 3384
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者