每盘菜都要吃到,而且吃的时间是一样
我们按照区间右端点从小到大排序,排在前面的是要优先满足的
假如1号区间是[l,r],2号区间在r之后还有选择,所以1号先考虑
二分一下答案判断一下就好
#include"cstdio" #include"queue" #include"cmath" #include"stack" #include"iostream" #include"algorithm" #include"cstring" #include"queue" #include"map" #include"set" #include"vector" #define ll long long #define mems(a,b) memset(a,b,sizeof(a)) using namespace std; const int MAXN = 205; const int MAXE = 10050; const int INF = 9999999; struct node{ int l,r; }seg[MAXN]; int vis[MAXE]; int n; bool cmp(node a,node b){ return a.r<b.r; } bool judge(int x){ mems(vis,0); for(int i=0;i<n;i++){ int cnt=0; for(int j=seg[i].l;j<seg[i].r;j++){ if(cnt==x) break; if(!vis[j]) vis[j]=1,cnt++; } if(cnt<x) return false; } return true; } int main(){ int low=0,high=INF,mid; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&seg[i].l,&seg[i].r); sort(seg,seg+n,cmp); int ans=0; while(low<=high){ mid=(low+high)>>1; if(judge(mid)){ ans=mid; low=mid+1; } else high=mid-1; } cout<<ans*n<<endl; return 0; }