链接:http://poj.org/problem?id=2398
题意:题意和2318差不多,最后要求球数相同的盒子数。
思路:输入的隔板不是按顺序的,所以先对隔板进行排序,最后统计。
#include<iostream> //#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1000+5; int n,m,x1,y1,x2,y2; struct Line { int upp,low; } line[maxn]; int cmp(Line l1,Line l2) { //return l2.upp-l1.upp; if(l1.upp<l2.upp) return 1; else return 0; //return l1.upp<l2.upp; } int toy[maxn]; int isleft(int x,int y,Line l) { if(x<l.low+(y-y2)*(l.upp-l.low)*1.0/(y1-y2)) return true; return false; } int binarysearch(int x,int y) { int l=0,r=n,mid; while(l<r) { mid=l+(r-l)/2; if(isleft(x,y,line[mid])) r=mid; else l=mid+1; } return l; } int main() { while(scanf("%d",&n) && n) { scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); memset(toy,0,sizeof(toy)); for(int i=0; i<n; ++i) scanf("%d%d",&line[i].upp,&line[i].low); sort(line,line+n,cmp); for(int i=0; i<m; ++i) { int x,y; scanf("%d%d",&x,&y); toy[binarysearch(x,y)]++; } sort(toy,toy+n+1);//盒子有n+1个 printf("Box\n"); int cnt=1; for(int i=0; i<n; ++i)//统计 { if(toy[i+1]==toy[i]) cnt++; else { if(toy[i]!=0) printf("%d: %d\n",toy[i],cnt); cnt=1; } if(i==n-1 && cnt>1)//当至少最后两个都相同的话,就要用这个进行判断 printf("%d: %d\n",toy[i],cnt); } if(toy[n]!=toy[n-1])//判断最后一个与前面的数不同 printf("%d: %d\n",toy[n],1); } return 0; }
这个统计写挫了,真的挫。
toy[n+1]=0;//第二种统计方法,增加一个数0来方便比较 for(int i=0; i<n+1; ++i) { if(toy[i+1]==toy[i]) cnt++; else { if(toy[i]!=0) printf("%d: %d\n",toy[i],cnt); cnt=1; } }
究竟是我抛弃了历史,还是历史遗弃了我。