题意:
解法:
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;
}