CodeForces 589F 二分答案

【題目鏈接】
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章