NOIP2018普及组第二题解析

Hello, 欢迎登录 or 注册!

/ 1评 / 0

本文作者:  本文分类:编程学习笔记  浏览:1346
阅读时间:671字, 约1分钟

题目链接:

https://www.luogu.com.cn/problem/P5016

这道题算是水题了。

我们假设已算出两边兵营的气势分别为sum1,sum2,且sum1<sum2,自然要将工兵放在sum1一边,那么我们需保证sum1+工兵的数量*工兵距m号的距离与sum2的差距最小,不妨先假设两式相等。
等式中除工兵距m号的距离(其实也就是答案)未知,其余都是已知量,便可以将此量用其他量表示出来,化简可得:工兵距m号的距离=(sum2-sum1)/工兵的数量。
由于用此等式算出的距离可能是浮点数,所以我们只需要进行四舍五入,算出离这个值最近的整数,便是答案。
还有就是边界值的处理,这个整数必然是在1~n的范围内,只要最后进行一个特判就行了。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	//freopen ("fight.in","r",stdin);
	//freopen ("fight.out","w",stdout);
	int m, n;
	long long sum=0, mul=0;
	long long c, p1, p2, s1, s2;
	int i;
	cin >> n;
	for(i=1; i<=n; i++)
	{
		cin >> c;
		sum += c;
		mul += c * i;
	}
	cin >> m >> p1 >> s1 >> s2;
	sum += s1;
	mul += p1 * s1;
	sum += s2;
	mul -= sum * m;
	p2 = -(mul-s2/2)/s2;
	
	if(p2 < 1)
	{
		p2 = 1;
	} else if (p2 > n)
	{
		p2 = n;
	}
	cout << p2;
	return 0;
}

关于作者

  1. Zhang, Xuheng说道:

    忘了说了。一定要开long long,否则只有80分。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注