题解 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;
}

转载于:https://www.cnblogs.com/Call-me-zhz/p/11287349.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值