首页 > > > 每日一题 | 帆船比赛问题

codeforces的C题,链接:https://codeforces.com/contest/1393/problem/C
这道题非常巧妙,是一道思维题。我们很容易想到,间隔的最小距离取决于出现次数最多的数。
假设这个数是u,出现了v次。那么我们把它均分到n个空格当中,v个数有v-1个间隔,所以每个间隔最大是m = (n - 1) // (v-1)。n-1是因为末尾的元素不产生空格但是会占据位置。我们只需要把剩下的数填入这v-1个空格当中就可以了,它们之间的间隔一定不会小于m。
但还有一个问题是,出现次数达到v的数可能并不只有u,一样可以用上面的方法,只是末尾要额外去掉这些数,有多少个数字出现了v次,就需要减去几。我们假设有y个数字出现了v次。那么答案就是(n - y) // (v - 1) - 1。最后要-1是因为每个区间的长度要去掉1才是间隙的距离。
AC代码:
from collections import Counter
t = int(input())
for _ in range(t):
n = int(input())
vals = list(map(int, input().split(' ')))
c = Counter(vals)
_, num = c.most_common()[]
if num == n:
print()
continue
for k, v in c.items():
if v == num:
n -= 1
print(n // (num - 1) - 1)
有N个选手要参加帆船比赛,帆船比赛规定只能两人组队,并且为了保证公平每一队的选手的体重之和应该一样。现在给定这n个选手的体重,要求将他们尽可能多得凑成队伍,请问最多能够凑成多少队?
最多t组数据,n小于50

- END -
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69966956/viewspace-3158411/ ,如需转载,请注明出处,否则将追究法律责任。