这道题是一个纠结啊,比赛时就不说了,,,看都没有看的,后来挺mdd学长讲了一下思路,又是离散又是dp的,当时听的头就大了,一直写不出来代码,后来看网上说黑书上有原题,,,二话不说,翻黑书,,接下来就是真正的悲剧,黑书上的思路挺经典的,代码也是挺简洁的,就是我一直理解不了。。想了几天了,今天中午终于想明白了,,,唉,,这叫一个过程漫长啊,,失败,,还是太弱小了。。。。
代码中的难点:为什么要将一个不存在的点赋值为-1,,我想这个问题想了好几天。原来和里面存的是如果包含那个点,最多能圈几个点,因为那个点本来就是不存在的,所以要将其赋值为-1.。。。。。
题目:
3 2 1 1 2 2 3 3
3
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; struct point { int x; int y; }aa[1005],bb[10000]; bool cmp1(point a,point b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } bool cmp2(point a,point b) { return a.x<b.x; } int main() { int n,r; while(scanf("%d%d",&n,&r)!=EOF) { for(int i=0;i<n;++i) scanf("%d%d",&aa[i].x,&aa[i].y); sort(aa,aa+n,cmp1); int top,sum,mmax=0,mmmax=0; for(int i=0;i<n;++i) { top=0;sum=0; int str=aa[i].x,end=aa[i].x+r; for(int j=0;j<n;++j) { if(str<=aa[j].x&&aa[j].x<=end) { bb[top].x=aa[j].y; bb[top].y=1; top++; bb[top].x=aa[j].y+r+1; bb[top].y=-1; top++; } } //cout<<top<<endl; sort(bb,bb+top,cmp2); mmax=0; for(int i=0;i<top;++i) { sum+=bb[i].y; //cout<<sum<<endl; mmax=sum>mmax?sum:mmax; } mmmax=mmmax>mmax?mmmax:mmax; } printf("%d\n",mmmax); } return 0; }