[HAOI2006]均分数据

[HAOI2006]均分数据

https://ac.nowcoder.com/acm/problem/19961

题意:
将n个数分成m组,求最小均方差?

思路:
随机打乱数组,然后贪心求结果,取最小值。
(double)clock()/CLOCKS_PER_SEC得出程序运行的时间,单位为S。
random_shuffle(a+1,a+n+1);打乱数组。
贪心策略:
前m个数每个数单独为一组,然后将剩余数分给当前最小数据和的组,可使用优先队列。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll inf=1e9+7;

int a[100005];

struct w
{
    int i, p;
}w;

bool operator<(struct w a,struct w b)
{
    return a.p>b.p;
};

int main()
{
    int n, m;
    double sum=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }
    sum=sum/m;
    double mi=inf;
    priority_queue<struct w> q;
    while((double)clock()/CLOCKS_PER_SEC<0.8)
    {
        for(int i=1;i<=m;i++)
        {
            w.i=i;
            w.p=a[i];
            q.push(w);
        }
        for(int i=m+1;i<=n;i++)
        {
            w=q.top();
            q.pop();
            w.p=w.p+a[i];
            q.push(w);
        }
        double pi=0;
        while(!q.empty())
        {
            w=q.top();
            q.pop();
            pi+=(w.p-sum)*(w.p-sum);
        }
        mi=min(pi,mi);
        random_shuffle(a+1,a+n+1);
    }
    printf("%.2f\n",sqrt(mi/m));
    return 0;
}
每日一题题解 文章被收录于专栏

写题解

全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务