Time Limit: 20 Sec
Memory Limit: 256 MB
http://codeforces.com/contest/551/problem/C
Input
Output
In a single line, print one number, minimum time needed to remove all the boxes in seconds.
Sample Input
2 1
1 1
Sample Output
4
题意
有一群小学生帮着老师搬东西,一开始小学生都在0点,然后每次每个小学生有两种操作,1是移动一格,2是搬走一堆东西
然后问你花费最少的时间
题解:
想dp的都是傻逼(没错就是我!
直接二分答案之后,然后贪心就好了……
代码:
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 2000001 #define mod 10007 #define eps 1e-9 const int inf=0x3f3f3f3f; const ll infll = 0x3f3f3f3f3f3f3f3fLL; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } //************************************************************************************** ll a[maxn],b[maxn]; int n,m; bool check(ll x) { for(int i=1;i<=n;i++) b[i]=a[i]; ll tmp=0; int cur=n; for(int i=1;i<=m;i++) { while(cur>=1&&b[cur]==0) cur--; if(cur==0) return 1; tmp=cur; if(tmp>x) continue; while(cur>=1&&b[cur]+tmp<=x) { tmp+=b[cur]; b[cur]=0; cur--; } if(cur==0) return 1; b[cur]-=(x-tmp); } return 0; } int main() { //test; ll sum=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum+=a[i]; } sum+=n; ll L=0,R=sum; while(L<R) { ll M=(L+R)>>1; if(check(M)) R=M; else L=M+1; } printf("%lld\n",R); return 0; }