Description
Input
Output
Sample Input
4 10 0 10 100 0 20 20 80 80 60 60 40 40 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0
Sample Output
Box 2: 5 Box 1: 4 2: 1
补充求叉积知识:
double direction(point p1, point p2, point p3){//p3对于p1->p2的转向,为正则顺时针 return (p3.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (p3.y - p1.y); }
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; int n, x1, x2, y1, y2; int ans[1010];//格子i中的玩具数量 int real_ans[1010]; struct Board{ int xu, xl; }board[1010]; struct Point{ int x; int y; }point[1010]; int jeogia(int id, int i){//求叉积 return (board[id].xu - board[id].xl) * (point[i].y - y2) - (point[i].x - board[id].xl) * (y1 - y2); } void judge(int i){//二分查找位置 int l = 1, r = n + 1, mid; while(l <= r){ mid = (l + r) / 2; int temp1 = jeogia(mid - 1, i); int temp2 = jeogia(mid, i); if (temp2 > 0){ if (temp1 < 0){ ans[mid - 1]++; break; } else r = mid - 1; } else l = mid + 1; } } bool cmp(Board a, Board b){ if(a.xu != b.xu) return a.xu < b.xu; else return a.xl < b.xl; } int main(){ int m; int i; while (cin >> n && n){ memset(ans, 0, sizeof(ans)); memset(real_ans, 0, sizeof(real_ans)); scanf("%d %d %d %d %d", &m, &x1, &y1, &x2, &y2); board[0].xu = board[0].xl = x1; board[n+1].xu = board[n+1].xl = x2; for(i = 1; i <= n; i ++){ scanf("%d %d", &board[i].xu, &board[i].xl); } sort(board+1, board+n+1, cmp); for(i = 1; i <= m; i ++){ scanf("%d %d", &point[i].x, &point[i].y); judge(i); } printf("Box\n"); for(i = 0; i <= n; i ++){ real_ans[ans[i]] ++; } for(i = 1; i <= m; i ++){ if(real_ans[i]) printf("%d: %d\n", i, real_ans[i]); } } return 0; }