UVALive 6442

这个题,题意就是,给你一个有N个点等距的环,编号[0,N-1],然后有些点上有一个或多个硬币,要移动这个硬币,使得所有的硬币在环上等距地放置且每个点只能放一个硬币,一个移动方案的花费定义为,每个硬币的移动距离中,最长的那个移动距离。

嗯,首先贴一下别人的题解,我这种智障训练时肯定是想不到的

其实是这样来考虑的,我们可以随便设置一系列参考点,不妨直接假设为(0,n/m,2*n/m,……),这样我们直接记录所有的点依次移动到这些对应位置所需要的最大的步奏和最小的步奏,这样我们就得到了到这一系列的位置的最大和最小值。这样我们需要的最终目标位置就是在最大值和最小值的中点处。

这里理解一下吧,就是答案了。。 

嗯,然后,我就只能来证明一下了(想了好久

我们先把这些硬币的位置升序排序嘛,这个肯定是首先的,假如排序后为,a1,a2,a3,,,am

然后我们先假设一种最终位置,0,n/m,2*n/m,,,,(n-1)*n/m,然后我们定义ai移动到对应位置的距离是ai-i*n/m,

然后我们可以得到他们每个的花费,假设为b1,b2,b3,,,bm,然后显然,这个方案的花费就是max{ abs(bi) },

那么其他方案呢,嗯,显然,我们其他方案就是,0+j,n/m+j,2*n/m+j,,,(n-1)*n/m+j,0<=j<n/m,

嗯其实就是我们可以将b1,b2,b3,,,bm全都加x或减x,x随便取值,那我们想要的是max{ abs(bi) }最小,怎么使它最小呢,

我们可以观察一下这个序列的最大值和最小值,假设为ap和aq,他们之间的差为dis,这个值肯定是不变的,

那么我们肯定就是通过使序列统一加减某数,使得这两个数的绝对值都尽可能小,ap和aq之间一共dis+1个点(包括他们两个),然后我们就让0点坐落在他们的中间那里就行

,然后答案就是(dis+1)/2了,,他们到中间点的距离,分奇偶看下发现,这个值就可以,我这种弱智终于明白了。。。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <string>
#include <set>
#include <map>
using namespace std;
#define ll long long
#define maxn 20005
int num[maxn];
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	int T;
	scanf("%d", &T);
	for (int kase = 1; kase <= T; ++kase)
	{
		int N, M;
		scanf("%d%d", &N, &M);
		for (int i = 0; i < M; ++i)
		{
			scanf("%d", &num[i]);
		}
		int ans = 0;
		int step = N / M;
		sort(num, num + M);
		int maxnum = 0, minnum = 99999999;
		for (int i = 0, pos = 0; i < M; ++i, pos += step)
		{
			maxnum = max(maxnum, num[i] - pos);
			minnum = min(minnum, num[i] - pos);
		}
		ans = (maxnum - minnum + 1) / 2;
		printf("Case #%d: %d\n", kase, ans);
	}
	//system("pause");
	//while (1);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值