Codeforces1476 B. Inflation(二分)
阿新 • • 發佈:2021-02-08
題意:
解法:
p i ∑ j = 1 i − 1 p j < k 100 \frac{p_i}{\sum_{j=1}^{i-1}p_j}<\frac{k}{100} ∑j=1i−1pjpi<100k
p i ∗ 100 < k ∗ s u m i − 1 p_i*100<k*sum_{i-1} pi∗100<k∗sumi−1
容 易 發 現 當 不 滿 足 條 件 時 , 往 p 1 上 加 數 是 最 優 的 容易發現當不滿足條件時,往p_1上加數是最優的 容易發現當不滿足條件時,往p1上加數是最優的
二
分
答
案
m
i
d
,
判
斷
p
i
∗
100
<
k
∗
s
u
m
i
−
1
是
否
成
立
即
可
二分答案mid,判斷p_i*100<k*sum_{i-1}是否成立即可
二分答案mid,判斷pi∗100<k∗sumi−1是否成立即可
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
int sum[maxm];
int a[maxm];
int n,k;
int check(int mid){
sum[1]=a[1]+mid;
for(int i=2;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
for(int i=2;i<= n;i++){
if(a[i]*100>k*sum[i-1]){
return 0;
}
}
return 1;
}
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
int l=0,r=1e16;
while(l<=r){
int mid=(l+r)/2;
if(check(mid))ans= mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
}
signed main(){
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}