题目大意:
- 1到N每个位置上有任意个盒子;
- 有M个人在初始0的位置上,可以用来搬盒子,人走一步或者搬一个盒子都要花费1个单位的时间
- 问最短需要多少时间将所有盒子搬完。
解题过程:
- 二分确定时间
- 用优先队列将有盒子的位置从后到前排列好,然后依次取出让人来搬
- 让人一个一个依次来搬盒子
遇到的问题
- 数据没有用 long long 来存
- 错误地把位置上面没有盒子的位置也放入到了优先队列中
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define rep(i,l,p) for(ll i=l;i<=p;i++)
#define fread() freopen("in.txt","r",stdin)
typedef long long ll;
typedef pair<ll,ll> P;
ll n,m;
ll a[100005];
ll b[100005];
vector<P> vec;
bool judge(ll x){
priority_queue<P> q;
for(ll i=0;i<vec.size();i++) q.push(vec[i]);
rep(i,1,m){
ll y = x - q.top().first;
while(y > 0 && !q.empty()){
ll pos = q.top().first;
ll res = q.top().second;
q.pop();
if(y > res){
y -= res;
}else if(y < res){
res -=y;
y = 0;
q.push(make_pair(pos,res));
}else{
y = 0;
}
}
}
if(q.empty()) return true;
return false;
}
int main(){
ios::sync_with_stdio(false);
cin >> n >> m;
rep(i,1,n) {
cin >> a[i];
if(a[i]) vec.push_back(make_pair(i,a[i]));
}
ll l = 0,r = 1e18;
ll mid;
while(r>l){
mid = (r+l)/2;
if(judge(mid)){
r = mid;
}else{
l = mid +1;
}
}
cout << r << endl;
return 0;
}