CF-Educational Codeforces Round 103 (Rated for Div. 2)-B. Inflation【贪心】

本文介绍了如何使用贪心策略解决给定序列中的元素增量问题,以确保处理后序列满足特定比例条件。通过从前往后逐步增加元素并保持计算结果不超过阈值,求得使总增量最小的操作序列。核心算法和AC代码展示了实现细节。
摘要由CSDN通过智能技术生成

题目链接
题意:给定一序列 { p 0 , p 1 , p 2 , . . . , p n − 1 } \{p_0,p_1,p_2,...,p_{n-1}\} {p0,p1,p2,...,pn1},以及一种操作: p i = p i + x i ( x i 为 正 整 数 ) p_i=p_i+x_i(x_i为正整数) pi=pi+xi(xi),使得处理后的序列满足 ∀ i ∈ { 1 , 2 , 3 , . . . , n − 1 } 有 p i ( p 0 + p 1 + ⋯ + p i − 1 ) ≤ k % \forall i \in \{1,2,3,...,n-1\} 有\frac{p_i}{(p_0 + p_1 + \dots + p_{i - 1})}\le k\% i{1,2,3,...,n1}(p0+p1++pi1)pik%
∑ x i \sum x_i xi的最小值。
思路:如果要加上一个值 x x x,那么加在前面一定对整个计算过程贡献更大,所以总体思路就是从前往后贪心,不够就加,注意为浮点误差尽量使用乘法运算以及除法注意取整。
AC代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const double eps=1e-9;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn = 1e5 + 10;
const int MAX = 1e5;
const double pi = acos(-1.0);
const ll INF = 0x3f3f3f3f3f3f3f;
/***************main****************/
ll T=1;
ll m,n;
ll a[maxn],sum[maxn];
int main() {
    T=read();
    while (T--) {
        ll k;
        n=read();
        k=read();
        for(int i=1;i<=n;i++) a[i]=read();
        ll res=a[1],ans=0;
        for(int i=2;i<=n;i++){
            if(a[i]*100>res*k){
                ll t=(a[i]*100-res*k+k-1)/k;
                res+=t;
                ans+=t;
            }
            res+=a[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值