1. 程式人生 > >CodeForces 551C GukiZ hates Boxes

CodeForces 551C GukiZ hates Boxes

要求 結束 箱子 數量 clas acc com const \n

題目鏈接:CodeForces 551C GukiZ hates Boxes

解題思路:

  題目要求最短時間,因此我們可以先考慮最長時間,最長時間一定是一個學生從開始走到結束,每走到一處就把該處箱子搬空,所以最長時間等於走到最後一個有箱子格子的步數ed加箱子總數sum。

  接下來二分所需時間,直接搜索最短時間,每次都對假設時間進行判斷。每次判斷都從第一格開始,因為要搬空一個格子的箱子一定需要學生走到該處,同時所有學生可以同時移動,所以從頭到尾判斷要搬空該處需要多少學生,再與有的學生數量進行比較。

代碼:

#include<bits/stdc++.h>
using namespace
std; const int maxn=1e5+5; long long n,m,a[maxn],ed; bool test_ok(long long time) { long long acc=0; long long p=0; for(int i=1;i<=ed;i++) { acc+=a[i]; while(i+acc>=time) { if(i>=time) return 0; acc-=(time-i); p
++; } } if(p<m) return 1; else if(p==m && acc==0) return 1; else return 0; } int main() { while(~scanf("%lld %lld",&n,&m)) { memset(a,0,sizeof(a)); long long sum=0; for(long long i=1;i<=n;i++) { scanf(
"%lld",&a[i]); sum+=a[i]; if(a[i]!=0) ed=i; } long long left=1,right=ed+sum,mid; while(right-left>1) { mid=(right+left)/2; if(test_ok(mid)) right=mid; else left=mid; } printf("%lld\n",right); } }

CodeForces 551C GukiZ hates Boxes