【題目鏈接】
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106786#problem/B
【解題報告】
這道題目對我來說關鍵在於讀對題意。
題意是:
有n盤菜,每道菜有一段可以吃的時間。the gourmet想要吃完所有n道菜,並且每道菜花的時間相同並且儘可能長,問你能不能做到。如果可以,輸出吃這n道菜的總時間。
裸二分,二分枚舉吃每道菜的時間即可。注意這裏用到一個貪心思想,就是我們怎麼來進行吃菜的最優方案。顯然我們應該對每道菜的時間段進行右端點排序,然後按照時間順序依次吃菜.這是因爲每次我們都把對之後影響最少的菜吃掉,所以這個方案就是最優方案。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
struct Node{
int l,r;
bool operator <( const Node& rhs )const
{
return r<rhs.r ||( (r==rhs.r) && ( l<rhs.l ) );
}
}a[maxn];
bool vis[maxn];
bool ok( int x,int N )
{
memset(vis,0,sizeof vis);
for( int i=1;i<=N;i++ )
{
int cnt=0;
for( int j=a[i].l+1;j<=a[i].r;j++ )if( !vis[j] )
{
vis[j]=1;
if( ++cnt==x )break;
}
if( cnt<x )return false;
}
return true;
}
int main()
{
int N; cin>>N;
// build( 1,1,N );
for( int i=1;i <=N; i++ ) cin>>a[i].l>>a[i].r;
sort( a+1,a+1+N );
int L=1,R=1e5+1;
while( L<R-1 )
{
int mid=(L+R)/2;
if( ok(mid,N) )L=mid;
else R=mid;
}
if(ok(L,N))cout<<L*N<<endl;
else cout<<0<<endl;
return 0;
}