题目地址:http://codeforces.com/problemset/problem/589/F
思路:先贪心按照右端点值排序(先把对后面影响最小的菜吃掉),二分吃每道菜的时间即可。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=105; const int maxt=1e5+50; struct Node { int l,r; }; int n; int v[maxt]; Node a[maxn]; int cmp(Node a,Node b) { if(a.r==b.r) return a.l<b.l; else return a.r<b.r; } int check(int x) { memset(v,0,sizeof(v)); for(int i=0; i<n; i++) { int t=0; for(int j=a[i].l; j<a[i].r; j++) if(!v[j]) { v[j]=1; if(++t>=x) break; } if(t<x) return 0; } return 1; } int main() { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d%d",&a[i].l,&a[i].r); sort(a,a+n,cmp); int l=0,r=1e5+1,mid; while(l<r-1) { mid=(l+r)/2; if(check(mid)) l=mid; else r=mid; //cout<<mid<<" "<<l<<" "<<r<<endl; } if(check(l)) printf("%d\n",l*n); else printf("0\n"); return 0; }
时间: 2024-11-05 12:46:08