题解 P5016 【龙虎斗】
jianzihao
2018-12-08 20:06:01
# 前言:感谢各位大佬的辅导,本人已略有进步
## 另外,
# 一定开long long!
# 一定开long long!
# 一定开long long!
# 一定开long long!
# 一定开long long!
## ~~我就因此与一等奖失之交臂~~
## 话休絮烦,直接亮代码:
```cpp
#include<bits/stdc++.h>//主定义神马的不说了
using namespace std;
struct longhudou{//用结构体储存变量
long long sbs;
long long sq;
long long jl;
}a[1000005];
long long zb(long long n)//这个没必要,看每个人喜好了(可以用abs代替)
{
if(n>=0)return n;
else return n*-1;
}
int main()
{
long long n,dra=0,tig=0,min=9e18,cz;//变量设置
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].sbs);//读入不说了
}
long long m,p1,p2,s1,s2;
scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);
a[p1].sbs+=s1;//直接带入
for(int i=1;i<=n;i++)
{
if((m-i)>0)
{
a[i].jl=m-i;
a[i].sq=a[i].jl*a[i].sbs;
dra+=a[i].sq;
}
else if((m-i)<0)
{
a[i].jl=i-m;
a[i].sq=a[i].jl*a[i].sbs;
tig+=a[i].sq;//士气及士兵数计算
}
else {
a[i].sq=0;//为m时直接为0
a[i].jl=0;
}
}
if(dra==tig){
printf("%lld",m);//相等直接输出
return 0;
}
if(dra>tig)
{
cz=dra-tig;
for(int i=m;i<=n;i++)
{
if(zb(a[i].jl*s2-cz)<min)
{
p2=i;
min=zb(a[i].jl*s2-cz);//比较,直到找到最优方案
}
}
}
if(dra<tig)
{
cz=tig-dra;
for(int i=1;i<=m;i++)
{
if(zb(a[i].jl*s2-cz)<min)
{
p2=i;
min=zb(a[i].jl*s2-cz);
}
}
}
printf("%lld",p2);//结束
return 0;
}
```
最后,[无耻宣传~~很好的~~团队](https://www.luogu.org/team/show?teamid=12607)