题解 P5016 【龙虎斗】

2018-12-08 20:06:01


前言:感谢各位大佬的辅导,本人已略有进步

另外,

一定开long long!

一定开long long!

一定开long long!

一定开long long!

一定开long long!

我就因此与一等奖失之交臂

话休絮烦,直接亮代码:

#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;
}

最后,无耻宣传很好的团队