NOIP2018PJ 龙虎斗

8.15纪中比赛T1

又是一道T1的签到题,又是一道模拟送分题,又是一道看似简单其实难的题……
题目描述:

在这里插入图片描述
在这里插入图片描述
样例输入1
6
2 3 2 3 2 3
4 6 5 2

样例输入2
6
1 1 1 1 1 16
5 4 1 1

样例输出1
2

样例输出2
1

在这里插入图片描述
题目解法:其实我们不难看出,这是一道模拟题。模拟出双方的兵势值,然后直接暴力求出放在那里才能使双方差距最小。我们可以将“天降神兵”这一操作看做原来就在那个地方的。但是,千万要注意两点:1.数据范围要开long long 2.可以放在中间点,也就是m的位置。

#include<cstdio>
#include<cmath>
using namespace std;
long long n,p1,s1,s2,m;
long long a[10000005]; 
long long left,right,ans=999999999,jl;
int main()
{
	freopen("fight.in","r",stdin);
	freopen("fight.out","w",stdout);
	left=right=0;
	scanf("%lld",&n);
	for(long long i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);
	for(long long i=1;i<=n;++i)
	{
		if(i<m) left+=(m-i)*a[i];
		if(i>m) right+=(i-m)*a[i];
	}
	if(p1>m) right+=(p1-m)*s1;
	if(p1<m) left+=(m-p1)*s1;
	for(long long i=1;i<=n;++i)
	{
		if(i<m)
		{
			left+=(m-i)*s2;	
			if(abs(right-left)<ans)
			ans=abs(right-left),jl=i;
			left-=(m-i)*s2;
		}
		if(i>m)
		{
			right+=(i-m)*s2;
			if(abs(right-left)<ans)
				ans=abs(right-left),jl=i;
			right-=(i-m)*s2;
		}
		if(i==m)
			if(abs(right-left)<ans)
				ans=abs(right-left),jl=i;
	}
	printf("%lld",jl);
	return 0;
}

好啦,感谢大家的观看!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值