1 条题解
-
0
思路
请注意数据范围!!!
第一步,我们需要算出起始气势(也就是天降神兵之后),我这里采用分开计算的方法(先算出起始的,再添加气势),也就是如下代码:
//初始气势 for(int i=1;i<m;i++)b1+=a[i]*(m-i); for(int i=m+1;i<=n;i++)b2+=a[i]*(i-m); if(p<m)b1+=+s1*(m-p); else if(p>m)b2+=s1*(p-m);
下一步,我们要进行循环,寻找p2的位置。
题目要求是两方气势的差尽可能小,所以我们用变量 mn记录当前气势的差(由于有可能出现小数减大数的情况,所以我们需要添加abs)。然后我们进行比较,哪方小哪方加气势。此处需要注意,我们需要额外判断一种情况,也就是战力相等的情况下,我们直接输出m,避免二人不玩的问题。
我们按照上面加上p1后再次计算气势的方法,一个个进行比较,算出与另一方气势最小的差,然后进行记录和输出。也就是如下代码:
mn=abs(b2-b1); if(b1<b2){ for(int i=1;i<m;i++){ b=b1;//避免值被覆盖的问题 b+=s2*(m-i); cha=abs(b2-b);//注意可能会有负值的情况 if(cha<mn){//打擂台(此处不推荐用min,因为我们最终要输出的值也会因为差最小值的变化而变化) mn=cha; mnb=i; } } } else if(b1>b2){ for(int i=m+1;i<=n;i++){ b=b2;//同理,此处不做解释 b+=s2*(i-m); cha=abs(b1-b);//同理,此处不做解释 if(cha<mn){//同理,此处不做解释 mn=cha; mnb=i; } } } else{ cout<<m; return 0; }
我们也要注意一下,还有一种可能情况就是一开始双方气势的差就是最小的,无论如何进行添加,都会超过原来的最小值,我们就需要输出m,也就是在上面代码对mn进行赋值的地方,我们用变量ymn来代表没有进行下方运算之前mn的值,在计算完成后,我们进行比较。也就是如下代码:
mn=abs(b2-b1); ymn=mn; //下方进行气势比较的代码省略,看上面的 //进行比较,如果相等输出m,否则输出添加气势的位置 if(mn==ymn)cout<<m; else cout<<mnb;
然后我们再加上定义和输入就可以啦!
小tip:大家可以先根据思路,写一下代码哦!
代码
#include<bits/stdc++.h> using namespace std; long long n,m,p,s1,s2,b1,b2,b,a[100005],cha,mn,ymn,mnb; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; cin>>m>>p>>s1>>s2; //初始气势 for(int i=1;i<m;i++)b1+=a[i]*(m-i); for(int i=m+1;i<=n;i++)b2+=a[i]*(i-m); if(p<m)b1+=+s1*(m-p); else if(p>m)b2+=s1*(p-m); mn=abs(b2-b1); ymn=mn; //比较+加兵 if(b1<b2){ for(int i=1;i<m;i++){ b=b1; b+=s2*(m-i); cha=abs(b2-b); if(cha<mn){ mn=cha; mnb=i; } } } else if(b1>b2){ for(int i=m+1;i<=n;i++){ b=b2; b+=s2*(i-m); cha=abs(b1-b); if(cha<mn){ mn=cha; mnb=i; } } } else{ cout<<m; return 0; } if(mn==ymn)cout<<m; else cout<<mnb; return 0; }
信息
- ID
- 1588
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者