1. 程式人生 > 其它 >Codeforces1476 B. Inflation(二分)

Codeforces1476 B. Inflation(二分)

題意:

在這裡插入圖片描述

解法:

p i ∑ j = 1 i − 1 p j < k 100 \frac{p_i}{\sum_{j=1}^{i-1}p_j}<\frac{k}{100} j=1i1pjpi<100k

p i ∗ 100 < k ∗ s u m i − 1 p_i*100<k*sum_{i-1} pi100<ksumi1

容 易 發 現 當 不 滿 足 條 件 時 , 往 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,pi100<ksumi1

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; }