题解 P5016 【龙虎斗】

这道题其实并不是很难,只需要暴力枚举就行了,应该是O(n)的复杂度

简单思路:暴力枚举每一个点后两方的气势差,但是,CCF会卡long long,所以我在考场上调试了很久才发现这个问题。
变量定义:nong为龙方的气势值,hu为虎方的气势值
贴上代码:

#include <iostream>
#include <cstdio> 
#include <cmath>
using namespace std;
long long a[100011];
int main()
{
    long long nong=0,hu=0;
    int i,j,k,n;
    long long m,s1,p1,p2;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%lld",&a[i]);
    scanf("%lld %lld %lld %lld",&m,&p1,&s1,&p2);
    a[p1]+=s1;   
    for(i=1;i<=n;i++)
    {
        if(i<m) nong+=a[i]*(m-i);   //统计龙方的气势值
        else if(i>m) hu+=a[i]*(i-m); //统计虎方的气势值
    }
    long long ans=abs(nong-hu);    //ans初始化为将工兵放在m号兵营里面
    int step=m;   //最小号兵营一开始赋值为m号兵营
    for(i=1;i<=n;i++)
    {
        if(i<m) //在m号兵营左边加龙方的气势值
        {
            if(ans>abs((nong+p2*(m-i)-hu)))
            {
                ans=abs((nong+p2*(m-i)-hu));
                step=i;
            }
        }
        else if(i>m) //在m号兵营左边加龙方的气势值
        {
            if(ans>abs(nong-(hu+p2*(i-m))))
            {
                ans=abs(nong-(hu+p2*(i-m)));
                step=i; 
            }
        }
    }
    cout<<step;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Call-me-zhz/p/11287349.html