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
不写不知道,一写吓一跳,原来这个是两码子的事。
中间有许多注意的东西,只有亲自写了,才知道的。
废话不多说,直接上代码。
#include "iostream" #include "algorithm" using namespace std; struct LineP { double up_x, down_x; }LP[1005]; bool Check(LineP p1, LineP p2) //排序子函数 { if(p1.up_x < p2.up_x) return true; return false; } double Judge(int j, double x, double y, double y1, double y2) //这个就是叉乘了 { return (LP[j].down_x - LP[j].up_x)*(y-y2) - (y2-y1)*(x-LP[j].down_x); } int main() { int n, m; double x1, y1, x2, y2, x, y; int ans[1005], realans[1005], low, high, mid; while(cin>>n && n) { memset(ans, 0, sizeof(ans)); memset(realans, 0, sizeof(realans)); cin>>m>>x1>>y1>>x2>>y2; for(int i=1; i<=n; i++) cin>>LP[i].up_x>>LP[i].down_x; LP[0].up_x = x1; LP[0].down_x = x1; LP[n+1].up_x = x2; LP[n+1].down_x = x2; sort(LP, LP+n+1, Check); for(int i=0; i<m; i++) { cin>>x>>y; low = 0; high = n+1; mid = (low+high)/2; if(Judge(0, x, y, y1, y2)==0) mid = 0; else if(Judge(n+1, x, y, y1, y2)==0) mid = n; else { while(low<high) { if(Judge(mid, x, y, y1, y2)<0) high = mid-1; else low = mid+1; mid = (low+high)/2; } if(Judge(mid, x, y, y1, y2) < 0) mid--; } ans[mid]++; } cout<<"Box"<<endl; for(int i=1; i<=n; i++) for(int j=0; j<=n+1; j++) if(ans[j]==i) realans[i]++; for(int i=0; i<=n; i++) if(realans[i]) cout<<i<<": "<<realans[i]<<endl; } }