bzoj 2428 均分数据

题目大意:

已知N个正整数

将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小

求最小均方差

思路:

模拟退火

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define MAXN 10100
11 #define inf 2139062143
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
18     return x*f;
19 }
20 double ans=inf,avg;
21 int n,m,a[MAXN],s[MAXN],bl[MAXN];
22 void work()
23 {
24     double T,tmp,res=0;
25     memset(s,0,sizeof(s));
26     for(int i=1;i<=n;i++)
27         bl[i]=rand()%m+1,s[bl[i]]+=a[i];
28     for(int i=1;i<=m;i++) res+=(s[i]-avg)*(s[i]-avg);
29     T=10000;
30     while(T>0.1)
31     {
32         T*=0.9;
33         int t=rand()%n+1,x=bl[t],y;
34         if(T>500) y=min_element(s+1,s+m+1)-s;
35         else y=rand()%m+1;
36         if(x==y) continue;
37         tmp=res;
38         res-=(s[x]-avg)*(s[x]-avg)+(s[y]-avg)*(s[y]-avg);
39         s[x]-=a[t],s[y]+=a[t];
40         res+=(s[x]-avg)*(s[x]-avg)+(s[y]-avg)*(s[y]-avg);
41         if(res<=tmp) bl[t]=y;
42         else if(rand()%10000>T) s[x]+=a[t],s[y]-=a[t],res=tmp;
43         else bl[t]=y;
44     }
45     if(res<ans) ans=res;
46 }
47 int main()
48 {
49     srand(19260817);
50     n=read(),m=read();
51     for(int i=1;i<=n;i++) a[i]=read(),avg+=a[i];
52     avg/=(double)m;
53     for(int i=1;i<=10000;i++) work();
54     printf("%.2lf\n",sqrt(ans/m));
55 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8982021.html

时间: 2024-10-27 12:48:13

bzoj 2428 均分数据的相关文章

BZOJ2428 均分数据

2428: [HAOI2006]均分数据 Time Limit: 5 Sec  Memory Limit: 128 MB Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值和. Input 第一行是两个整数,表示N,M的值(N是整数个数,M是要分成的组数) 第二行有N个整数,表示A1.A2.…….An.整数的范围是1--50. (同一

[HAOI2006][BZOJ2428] 均分数据

2428: [HAOI2006]均分数据 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 801  Solved: 231[Submit][Status][Discuss] Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值和. Input 第一行是两个整数,表示N,M的值(N是整数个数,

bzoj 2428: [HAOI2006]均分数据

1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #include<ctime> 5 #include<cstring> 6 #include<cmath> 7 #include<algorithm> 8 #define M 100 9 using namespace std; 10 int n,m,a[M],pos[M]; 11 double re

2428: [HAOI2006]均分数据

模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如果没有变小,按模拟退火的玄学方式判断一下,也要交换. srand(time(0))在bzoj会RE,不知为何. 非常玄学的正确性,没拍多少数据就会出现差别,然而OJ上可以过的. //Twenty #include<cstdio> #include<cstdlib> #include&l

洛谷P2503 [HAOI2006]均分数据(模拟退火)

题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行是两个整数,表示N,M的值(N是整数个数,M是要分成的组数) 第二行有N个整数,表示A1.A2.…….An.整数的范围是1--50. (同一行的整数间用空格分开) 输出格式: 输出文件data.out包括一行,这一行只包含一个数,表示最小均方差的值(保留小数点后两位数字). 输入输出样例 输入样例#

BZOJ2428 [HAOI2006]均分数据

正确方法是模拟退火? 根据wulala的讲法,我们多random_shuffle几发,对序列贪心一下就好了 反正都是随机化的做法,能过就行2333 1 /************************************************************** 2 Problem: 2428 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:3356 ms 7 Memory:816 kb 8 ***********

【链表】bzoj 1150: [CTSC2007]数据备份Backup

1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1136  Solved: 458[Submit][Status][Discuss] Description Input 输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 000)表示办公楼的数目,k(1≤ k≤ n/2)表示可利用的网络电缆的数目.接下来的n行每行仅包含一个整数(0≤ s ≤1000 000 000), 表示每个办公楼到大

bzoj4428 均分数据

Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值和. Input 第一行是两个整数,表示N,M的值(N是整数个数,M是要分成的组数) 第二行有N个整数,表示A1.A2.…….An.整数的范围是1--50. (同一行的整数间用空格分开) Output 这一行只包含一个数,表示最小均方差的值(保留小数点后两位数字).首先任取一个初始的分

bzoj 1150: [CTSC2007]数据备份Backup

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一