本文作者:Zhang, Xuheng
本文分类:编程学习笔记 浏览: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;
}
关于作者Zhang, Xuheng
- 还没有填写个人简介
- Email: hy23682@126.com
- 注册于: 2020-04-07 05:11:14
忘了说了。一定要开long long,否则只有80分。