题解 P5016 【龙虎斗】

jianzihao

2018-12-08 20:06:01

Solution

# 前言:感谢各位大佬的辅导,本人已略有进步 ## 另外, # 一定开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)