您的位置:首页 > 其它

codeforces 589F:贪心

2016-01-21 21:00 288 查看
每盘菜都要吃到,而且吃的时间是一样

我们按照区间右端点从小到大排序,排在前面的是要优先满足的

假如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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: