1 条题解

  • 0
    @ 2024-10-16 10:48:35

    思路

    请注意数据范围!!!

    第一步,我们需要算出起始气势(也就是天降神兵之后),我这里采用分开计算的方法(先算出起始的,再添加气势),也就是如下代码:

    //初始气势 
    	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;
    }
    
    
    • 1

    信息

    ID
    1588
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者