2016年7月22日 星期五

TIOJ 1432. 骨牌遊戲

TIOJ 1432. 骨牌遊戲
題目概述:
簡單來說,就是給定一個數列,然後把數列切w刀,使得數列變成w+1塊。
請使每塊的數值總和的最大值 最小。

思路:
基本上就是二分搜答案。假設要詢問能不能切w刀達到最大值最小為x,那就直接從第一個開始加,只要大於x就切,那看到最後有沒有切超過w刀!那要注意的是只要有一個數值大於x那就要直接判成無法達到。


//By SCJ
//tioj 1432
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int a[1002],n,w;
inline bool ck(int x)
{
   int sum=0,cnt=0;
   for(int i=0;i<n;++i)
   {
       if(a[i]>x) return false;
       if(sum+a[i]>x) cnt++,sum=a[i];
       else sum+=a[i];
   }
   return cnt<=w;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
   while(cin>>n>>w,n!=0)
   {
       for(int i=0;i<n;++i) cin>>a[i];
       int l=0,r=1000000;
       while(l<r)
       {
           int mid=(l+r)/2;
           if(ck(mid)) r=mid;
           else l=mid+1;
       }
       cout<<l<<endl;
   }
}



沒有留言:

張貼留言