Ericnth的小站

  • 你可能还想了解...
  • 首页
  • 编程学习笔记
  • 系统与软件
  • 摄影
  • 随笔
  • 论坛
  • 公告

NOIP2018普及组第二题解析

  • Zhang, Xuheng
  • 2020-06-26
  • 0

题目链接:

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

你可能还想了解...

  • A Bayesian Analysis of High School Acceptance Rates in Shanghai
  • HYRing项目代码解读
  • 算法讲解之贪心算法(转)
  • 算法讲解之回溯法(转)
  • C/C++ IDE推荐
© 2023 Ericnth的小站
Theme by Wing
沪ICP备2020025694号 沪公网安备31011202012861号
  • {{ item.name }}
  • {{ item.name }}