C. Pinkie Pie Eats Patty-cakes(构造,均分)

感谢kadia和CK大佬的耐心讲解

我知道自己菜,但在昨天才知道自己这么菜呜呜

D没过认了,C还是第一次没过,自闭了…

抱怨结束。

同步于这里,来这里观看体验更差哦好哦

一开始想二分,模拟,优先队列,dp啥的乱来的同学注意了

越往复杂的地方想越想不到,没思路了赶紧往简单的地方想

举个例子,这组样例

1 1 1 1 2 3 4 5

明 显 1 这 么 多 , 影 响 答 案 的 肯 定 1 而 不 是 其 他 数 字 明显1这么多,\color{red}{影响答案的肯定1}而不是其他数字 1,1

这组样例这么摆放是最优秀的,答案是1

1 2 1 3 1 4 1 5

所以看出策略是以出现最多的数字作为隔板,其他数字填充进去

但是当出现最多数字不止1个时,情况有变化

举个例子

1 1 1 1 2 2 2 2 3 4 5 6 7 8

由于1和2出现次数都最多,所以答案由1和2决定

这个时候,我们以1和2作为隔板

这样去构造1 2 (其他数) 1 2 (其他数) 1 2 (其他数) 1 2 (其他数)

1 2 (3 4) 1 2 (5 6) 1 2 (7 8) 2 6

所 以 设 出 现 次 数 最 多 的 数 出 现 了 x 次 , 有 n u m 个 数 出 现 了 x 次 所以设出现次数最多的数出现了x次,有num个数出现了x次 x,numx

答 案 是 ( n − n u m ∗ x ) / ( x − 1 ) + n u m − 1 答案是(n-num*x)/(x-1)+num-1 (nnumx)/(x1)+num1

解释一下

n − n u m ∗ x n-num*x nnumx是出现次数不是最多数字的个数,这些数可以填充到隔板中间

也就是此时间隔了 ( n − n u m ∗ x ) / ( x − 1 ) (n-num*x)/(x-1) (nnumx)/(x1)

至于怎么填充不用关心

因为总会有策略使得出现次数不是最多的数间隔大于出现次数最多的数

n u m − 1 num-1 num1是隔板的贡献,比如上面例子隔板1 2长度是2

那么贡献是1,因为隔板1 2对1的贡献只有一个2而已

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int t,n,a[maxn],vis[maxn];
int main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		int num=0,maxx=0;
		for(int i=1,x;i<=n;i++)
		{
			cin >> x;
			maxx=max(maxx,++vis[x] );
		}
		for(int i=1;i<=n;i++)
		{
			if( vis[i]==maxx )	num++;
			vis[i]=0;
		}
		cout<< (n-maxx*num)/(maxx-1)+num-1 << endl;
	}
}
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值