题意:给出 n 个数,随意排列使相邻的两个数右边大于左边的数对最多。
先排序,然后把每个数字出现的次数放入一个新的数组 b,再排序。
假如 b 数组排序后是 1 3 4 5,每次都以最小的为基准选出 1*4 个数(三对,ans+=3),然后剩为 1-1,3-1,4-1,5-1 即 2, 3, 4,以此类推。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> using namespace std; int a[1005]; int b[1005]; int main(){ //freopen("a.txt", "r", stdin); int n; while(~scanf("%d", &n)){ a[0] = -1; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a+1, a+1+n); int ans = 0, cnt = 0, k = 1; for(int i = 1; i <= n; i++){ if(a[i]!=a[i-1] && i!=1){ b[k++] = cnt; cnt = 1; }else{ cnt++; } if(i==n) b[k++] = cnt; } //for(int i = 1; i < k; i++) cout << b[i] << endl; b[0] = 0; sort(b, b+k); int w = k-2; for(int i = 1; i < k; i++){ ans += (w--)*(b[i]-b[i-1]); } cout << ans << endl; } return 0; }