Problem Description
给你T组数据,每组数据给你m个数,让你分配成四组,分别是0-a,a+1-b,b+1-c,c+1-160,(每组的人数 与 m / 4.0) 的差值的和最小。有多组情况,输出a,b,c最小的情况
枚举所有情况
#include<bits/stdc++.h>
using namespace std;
int a[200];//桶排的方式存数
int main()
{
int T, cas = 1;
scanf("%d", &T);
while(T--)
{
memset(a, 0, sizeof(a));
int m, num;
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
scanf("%d", &num);
a[num]++;
}
int x = 0, y, z;
int ans, ans1, ans2, i, j, k;
double ave = m / 4.0;
double t = 0x3f3f3f3f;
for(i = 0; i <= 160; i++)//枚举
{
x += a[i];//0-i的区间的个数
y = 0;
for(j = i + 1; j <= 160; j++)//i + 1 - j区间的个数
{
y += a[j];
z = 0;
for(k = j + 1; k <= 160; k++)//j + 1 - k区间的个数
{
z += a[k];
double tt = abs(x - ave) + abs(y - ave) + abs(z - ave) + abs(m - x - y - z - ave);//求(每组的人数 与 m / 4.0差值) 的和
if(tt < t)//如果比t小更新结果
{
t = tt;
ans = i;
ans1 = j;
ans2 = k;
}
}
}
}
printf("Case %d: %d %d %d\n", cas++, ans, ans1, ans2);
}
return 0;
}