题解 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;
}
posted @ 2019-08-02 11:05  zhz小蒟蒻  阅读(195)  评论(0)    收藏  举报