题目链接
题意:给定一序列
{
p
0
,
p
1
,
p
2
,
.
.
.
,
p
n
−
1
}
\{p_0,p_1,p_2,...,p_{n-1}\}
{p0,p1,p2,...,pn−1},以及一种操作:
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,...,n−1}有(p0+p1+⋯+pi−1)pi≤k%
问
∑
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;
}