您的位置:首页 > 其它

CF 589F 贪心+二分

2016-07-26 21:29 453 查看
题意是有N道菜,需要吃到每一种菜,且每种菜要吃相同时间。

那么按时间右端点排序,再依次有空则吃。为什么这样贪心是正确的呢,因为选择更早结束的菜,那么之后就会剩下更多的时间去吃其余的菜,那么贪心是正确的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
int n;
bool vis[10010];
struct node
{
int a,b;
bool operator<(const node &x) const
{
return b<x.b;
}
}t[maxn];
bool check(int mid)
{
//memset(vis,0,sizeof(vis));
for(int i=0;i<10010;i++)
{
vis[i]=false;
}
for(int i=1;i<=n;i++)
{
if(t[i].b-t[i].a<mid) return false;
int cnt=0;
for(int j=t[i].a;j<t[i].b;j++)
{
if(cnt>=mid) break;
if(!vis[j])
{
vis[j]=true;
cnt++;
}
}
if(cnt<mid) return false;
}
return true;
}

int bin(int l,int r)
{
int ans=l;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
return ans;
}

int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t[i].a,&t[i].b);
}
sort(t+1,t+1+n);
printf("%d\n",bin(0,t
.b)*n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: