思维——ZOJ3981Balloon Robot

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3981

题目分析:

所有的队伍都在周长为m的圆桌上,由机器人送气球,从起点s开始绕着圆桌转,如果在某个座位上的a队伍A题的时间为b,气球送到的时间为t,则不开心值加t-b;

队伍a在时间b过题时的不开心值为x = (a-s-b%m)%m,这也是他们等待气球的时间;

首先将机器人的起点s设为1;

将每个过题点等待的时间存下之后由小到大排序;

遍历p次依次使每个过题点的等待时间为0,即使每次都使s后移x,那么排在x及其之后的等待时间减少x,排在其之前的增加m-x;

找出最小的不开心总值。

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAX = 100010;
long long p[MAX];
long long d[MAX];
int main()
{
	int t;
	long long n, m, c, a, b;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%lld %lld %lld", &n, &m, &c);
		long long ans = 0, temp = 0;
		for(int i = 0; i < n; i++)
		{
			scanf("%lld", &p[i]);
		}
		for(int i = 0; i < c; i++)
		{
			scanf("%lld %lld", &a, &b);
			d[i] = (p[a-1] - 1 - b%m + m)%m;
			ans += d[i];
		}
		sort(d, d+c);
		temp = ans;
		for(int i = 0; i < c; i++)
		{
		//	cout<<d[i]<<endl;
		//	cout<<temp - c*d[i] + i*m<<endl;
			ans = min(ans, temp - c*d[i] + i*m);
		}
		cout<<ans<<endl;
	} 
	return 0;
} 





猜你喜欢

转载自blog.csdn.net/swin16/article/details/79250217