【2分の1】プレゼントを買う苦労
7422 ワード
XさんはCさんにN件のプレゼントを选んで、顺番に买って赠りましたが、给料も小遣いもないかわいそうな子供として、M人の親切な学生が援助の手を差し伸べました.しかし、最高の借金を减らすために、XさんはOIコンテストのあなたが合理的に计画して、彼に楽にプレゼントを送ることができることを望んでいます.
Input
最初の行には、スペースで区切られた2つの正の整数NとM以下のN行を入力し、行ごとに10000を超えない正の整数を入力し、贈り物の価格を順次表します.
Output
1つの整数、すなわち最高借入金量.
タイトルはバグがありますが、実はm+1人で、それから私はAになりました...答えの範囲は最大のa[i]からすべてのa[i]の和の間にあり、次いで2分midである.順番に取り、midまたはmid以内のお金を借りることができればr=mid、そうでなければl=mid+1で答えを出力します.
Input
最初の行には、スペースで区切られた2つの正の整数NとM以下のN行を入力し、行ごとに10000を超えない正の整数を入力し、贈り物の価格を順次表します.
Output
1つの整数、すなわち最高借入金量.
タイトルはバグがありますが、実はm+1人で、それから私はAになりました...答えの範囲は最大のa[i]からすべてのa[i]の和の間にあり、次いで2分midである.順番に取り、midまたはmid以内のお金を借りることができればr=mid、そうでなければl=mid+1で答えを出力します.
#include
#include
using namespace std;
int n,m,a[100001],l;
long long r,mid;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
r+=a[i];
l=max(l,a[i]);
}
++m;
while(l<r){ //
mid=(l+r)/2;
long long s=0,k=0,lq=0,lr=0;
while(k<n){
++k; // k
if(lq+a[k]<=mid) lq+=a[k]; // ,
else{ // ,
lr++; //
lq=0; //
if(lr>m) break; // ,
--k; //
}
}
if(lq>0) lr++; //
if(lr>m) l=mid+1; //
else r=mid;
}
printf("%d",l);
}