题意:
中文
(样例解释:
第一组:用5天卖7件物品,最优答案每天的情况分别为(100+400, 300+100, 500 ,101 ,400),5天中最大值为500。
第二组:用2天卖4件物品,最优答案每天的情况分别为(2+6, 4, 2),2天中最大值为8。
若第二组可以用3天卖4件物品,最优答案每天的情况分别为(2, 6, 4+2),3天中最大值为6。
)
思路:
二分枚举每天卖的最大值上限。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=100005;
long long a[MAXN],fans;
int T,n,m;
bool solve(long long lim){
long long sum=0;
long long cost=1;
long long ans=0;
int i=0;
while(1){
if(i>=n) break;
if(cost>m) return 0;
if(a[i]+sum>lim){
ans=max(ans,sum);
sum=0;
cost++;
continue;
}
sum+=a[i];
i++;
}
return 1;
}
int main(){
cin>>T;
while(T--){
cin>>n>>m;
long long ri=0;
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
ri+=a[i];
}
long long le=ri/m;
fans=ri;
long long mid=(le+ri)/2;
while(le<=ri){
mid=(le+ri)/2;
//cout<<le<<' '<<ri<<' ';
if(solve(mid))
ri=mid-1;
else
le=mid+1;
//cout<<fans<<endl;
}
cout<<le<<endl;
}
}
Description
你的朋友小明有n个古董,每个古董的价值给出,然后小明要在接下来的m天内将所有古董依次卖出(注意:必须依次卖出,也就是从第一个开始卖卖到最后一个),小明希望 的是这m天内卖出的价值和的最大值最小,你来帮助他把
Input
一共T组数据,每组一个n和m,代表n个古董以及m天(1<=m<=n),然后下面n行为古董的价值,古董价值为1到10000(1<=n<=100000)
Output
输出m天内卖出的古董价值和的最大值(当然是最优的时候),我们希望的是这个最大值越小越好
Sample Input
3 7 5 100 400 300 100 500 101 400 4 3 2 6 2 4 4 2 2 6 2 4
Sample Output
500 6 8