题目链接: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); } }
原文地址:https://www.cnblogs.com/KasenBob/p/10828045.html
时间: 2024-11-05 11:00:44