最后是用了最大覆盖方法做的,不会超时,前面注释部分贪心策略估计也许应该错了,求大神帮忙指出
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; /*struct point { int x,y; }p[220]; bool cmp(point a,point b) { if(a.y==b.y) return a.x>b.x; return a.y<b.y; } int main() { int t,n,s,e,i; cin>>t; while(t--) { scanf("%d",&n); for(i=0;i<n;++i) { scanf("%d%d",&s,&e); s=(s+1)/2; e=(e+1)/2; if(s>e) swap(s,e); p[i].x=s; p[i].y=e; } sort(p,p+n,cmp); int len=n-1,tot=0,mark; while(len) { mark=0; for(i=0;i<n;++i) if(p[i].x>mark) { mark=p[i].y; p[i].x=-1; len--; } tot++; } printf("%d\n",tot*10); } return 0; }*/ int main() { int t,n,i,a,b,re[205],j; cin>>t; while(t--) { cin>>n; memset(re,0,sizeof(re)); for(i=0;i<n;++i) { scanf("%d%d",&a,&b); a=(a+1)>>1; b=(b+1)>>1; if(a>b) swap(a,b); //注意题目并没有说a一定小于b for(j=a;j<=b;++j) re[j]++; } int Max=0; for(i=1;i<202;++i) Max=max(Max,re[i]); printf("%d\n",Max*10); } return 0; }