You are given an array aa of nn integers. Initially there is only one copy of the given array.
You can do operations of two types:
You need to find the minimal number of operations needed to obtain a copy where all elements are equal.
Input
The input consists of multiple test cases. The first line contains a single integer tt (1≤t≤1041≤t≤104) — the number of test cases. Description of the test cases follows.
The first line of each test case contains a single integer nn (1≤n≤1051≤n≤105) — the length of the array aa.
The second line of each test case contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109) — the elements of the array aa.
It is guaranteed that the sum of nn over all test cases does not exceed 105105.
Output
For each test case output a single integer — the minimal number of operations needed to create at least one copy where all elements are equal.
Example
input
Copy
6 1 1789 6 0 1 3 3 7 0 2 -1000000000 1000000000 4 4 3 2 1 5 2 5 7 6 3 7 1 1 1 1 1 1 1
output
Copy
0 6 2 5 7 0
Note
In the first test case all elements in the array are already equal, that's why the answer is 00.
In the second test case it is possible to create a copy of the given array. After that there will be two identical arrays:
[ 0 1 3 3 7 0 ][ 0 1 3 3 7 0 ] and [ 0 1 3 3 7 0 ][ 0 1 3 3 7 0 ]
After that we can swap elements in a way so all zeroes are in one array:
[ 0 0– 0– 3 7 0 ][ 0 0_ 0_ 3 7 0 ] and [ 1– 1 3 3 7 3– ][ 1_ 1 3 3 7 3_ ]
Now let's create a copy of the first array:
[ 0 0 0 3 7 0 ][ 0 0 0 3 7 0 ], [ 0 0 0 3 7 0 ][ 0 0 0 3 7 0 ] and [ 1 1 3 3 7 3 ][ 1 1 3 3 7 3 ]
Let's swap elements in the first two copies:
[ 0 0 0 0– 0– 0 ][ 0 0 0 0_ 0_ 0 ], [ 3– 7– 0 3 7 0 ][ 3_ 7_ 0 3 7 0 ] and [ 1 1 3 3 7 3 ][ 1 1 3 3 7 3 ].
Finally, we made a copy where all elements are equal and made 66 operations.
It can be proven that no fewer operations are enough.
- #include
- #include
- #include
- using namespace std;
- const int N=2e5+10;
- typedef long long ll ;
- ll a[N];
- int t,n;
- map
int>mp; - int main()
- {
- cin>>t;
- while(t--)
- {
- cin>>n;
- int maxx=0;
- ll maxv=0;
- mp.clear();
- fill(a,a+n,0);//用memset会超时
- for(int i=0;i
- {
- cin>>a[i];
- mp[a[i]]++;
- if(mp[a[i]]>maxx)
- {
- maxx=mp[a[i]];
- maxv=a[i];
- }
- }
- if(mp[a[0]]==n)cout<<0<
- else
- {
- int count=0;
- while(mp[maxv]
- {
- count++;//扩展
- if(n-mp[maxv]>=mp[maxv])//供不应求
- {
- count+=mp[maxv];
- if(n-mp[maxv]==mp[maxv])break;
- }
- else//通货膨胀,只要少数几个
- {
- count+=(n-mp[maxv]);
- break;
- }
- mp[maxv]+=mp[maxv];//扩展之后的
- }
- cout<
- }
- }
- }
-
相关阅读:
vue3.0 新增组件
Linux下 gdb调试打印数组元素说明
Spring Framework 6正式发布,携JDK 17&Jakarta EE开启新篇章
基于属性词补全的武器装备属性抽取研究
内网配置git代理
手机网页,输入时 软键盘盖住输入框完整解决方案,兼容安卓、鸿蒙、苹果IOS
2022河南萌新联赛第(七)场:南阳理工学院 B - 龍
STM8的C语言编程(11)--+切换时钟源
华为机试真题 C++ 实现【矩阵最大值】
Android12之DRM基本接口实现(二)
-
原文地址:https://blog.csdn.net/qq_62079079/article/details/126094726