虽然历经艰辛,最终在各位大佬的帮助下,我终于算是独立完成一道题了(撒花)
我用的二分法
AC题解:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,k;
int p[110];//用来储存 Pn个系数
bool check(int ans){
int sum[110];//对应系数的前n项和
for(int i=0;i<=n;++i) sum[i]=0;
sum[0]=p[0]+ans;
for(int i=1;i<n-1;++i) sum[i]=sum[i-1]+p[i];
for(int i=1;i<n;++i)
{
if(p[i]*100<=k*sum[i-1]) continue;
else
return 0;
}
return 1;
}
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
for(int i=0;i<n;++i) scanf("%lld",&p[i]);
int maxn=0;
for(int i=0;i<n;++i)
maxn=max(maxn,p[i]);//maxn是数组p中的最大值
int l=0,r=maxn*100,mid;
while(l<r){
mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}
一开始我在check()函数里加了一句p[0]+=ans;因为p[]是全局数组,这会导致p[0]会不断叠加(多亏大佬rty提醒)
还有就是右端点r的取值,r=maxn*100是为了防止r过小,后来我试了一下,把r改成r=1e15也可以
还有就是左端点l,最开始我初值取的1,一直AC不了,最后还是某大佬提醒,改的0。