每次都取最多的不相交区间,那么总的时间肯定是最小的。
总结:刚刚开始时是按照右端点进行排序,wa了几发,然后改为按照左端点排序就过了。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 205; int vis[N]; struct Node { int l,r; }s[N]; bool cmp(Node a,Node b) { return a.l < b.l; } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d%d",&s[i].l,&s[i].r); if(s[i].l > s[i].r) { swap(s[i].l,s[i].r); } s[i].l = (s[i].l + 1) / 2; s[i].r = (s[i].r + 1) / 2; } memset(vis,0,sizeof(vis)); sort(s,s+n,cmp); int end,cnt = 0; for(int i = 0; i < n; i++) { if(vis[i]) { continue; } end = s[i].r; vis[i] = true; for(int j = 0; j < n; j++) { if(!vis[j] && end < s[j].l) { end = s[j].r; vis[j] = true; } } cnt++; } printf("%d\n",cnt*10); } return 0; }