Load Balancing 折半枚举大法好啊

                            Load Balancing

给出每个学生的学分。   将学生按学分分成四组,使得sigma (sumi-n/4)最小。         算法:   折半枚举

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const int EXP=1e-5;
18 const int MS=161;
19
20 int num[MS];   //  学分为i的人数
21 int sum[MS];     //   学分<=i的人数
22
23 int main()
24 {
25       int T,kase=1,n,x;
26       scanf("%d",&T);
27       while(T--)
28       {
29             memset(num,0,sizeof(num));
30             memset(sum,0,sizeof(sum));
31             scanf("%d",&n);
32             for(int i=0;i<n;i++)
33             {
34                   scanf("%d",&x);
35                   num[x]++;
36             }
37             sum[0]=num[0];     //  note:  sum[0]!=0;
38             for(int i=1;i<MS;i++)
39                   sum[i]=sum[i-1]+num[i];
40             //  折半枚举
41             int ansa,ansb,ansc;
42             int ta,tc;
43             double sum1,sum2,sum3=INF;
44             double ave=double(n)/4.0;
45             for(int b=1;b<MS-2;b++)
46             {
47                   sum1=INF*1.0;
48                   sum2=INF*1.0;
49                   for(int a=0;a<b;a++)
50                   {
51                         double t=fabs(double(sum[a])-ave)+fabs(double(sum[b]-sum[a])-ave);
52                         if(t<sum1)
53                         {
54                               sum1=t;
55                               ta=a;
56                         }
57                   }
58
59                   for(int c=b+1;c<MS-1;c++)
60                   {
61                         double t=fabs(double(sum[c]-sum[b])-ave)+fabs(double(sum[MS-1]-sum[c])-ave);
62                         if(t<sum2)
63                         {
64                               sum2=t;
65                               tc=c;
66                         }
67                   }
68                   if(sum1+sum2<sum3)
69                   {
70                         sum3=sum1+sum2;
71                         ansa=ta;
72                         ansb=b;
73                         ansc=tc;
74                   }
75             }
76             printf("Case %d: %d %d %d\n",kase++,ansa,ansb,ansc);
77       }
78       return 0;
79 }
时间: 2024-12-30 03:19:32

Load Balancing 折半枚举大法好啊的相关文章

CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] Description Give you n packs, each of it has a value v and a weight w. Now you should find some packs, and the total of these value is max, total of

lightoj 1235 Coin Change (IV)(折半枚举)

话说这是俺们学校暑假集训完的一道题,刚看到以为是到水题,后来发现者复杂度也太大了,受不了了,比赛完也没搞出来,然后欣爷说这是折半枚举.然后就摸摸的学了一下,又把这道题写了一下, 所谓折半枚举就是先算出来一半,再算一半,然后用二分查找看看能不能搞到这一发状态,可以的话就是可以了, 题意:给你两个数n,k,下面再给你n个数,表示你现在有的硬币的面值,每种硬币面值的有两个,看是否可以支付k 题解思路:首先以为只有三种状态,直接dfs就好了,后来发现复杂度太大了,然后死了撸就是上面的,详细情残考代码 源

How Node.js Multiprocess Load Balancing Works

As of version 0.6.0 of node, load multiple process load balancing is available for node. The concept of forking and child processes isn't new to me. Yet, it wasn't obvious to me how this was implemented at first. It's quite easy to use however: var c

LVS Load Balancing Linux Virtual Server

简介:Linux虚拟服务器(Linux Virtual Server. LVS),是一个由章文松开发的自由软件.利用KVS可以实现高可用的.可伸缩缩的Web, Mail, Cache和Medial等网络股务..井在此基 础上开发支持庞大用户数的,可伸缩的,高可用的电子商务应用.LVS1998年发展到现在,已经变得比较成熟,目前广泛应用在各种网络服务和电了商务应用 中.LVS具有很好的伸缩缩性.可靠性和管埋性,通过LVS要实现的最终目标是:利用linux 操作系统和LVS集群软件实现一个高可用.高

linux集群系列(1) --- LVS之load balancing(NET、DR、TUN)

 一.简介     1.1.  负载均衡集群:LB (load balancing) 负载均衡集群为企业需求提供了更实用的系统.如名称所暗示的,该系统使负载可以在计算机集群中尽可能平均地分摊处理.该负载可能是需要均衡的应用程序处理负载或网络流量负载.这样的系统非常适合于运行同一组应用程序的大量用户.每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡.对于网络流量也是如此.通常,网络服务器应用程序接受了太多入网流量,以致无法迅速处理,这就需要将流量发送给在其它节点上运行的网络

HDU 5340 Three Palindromes( 折半枚举+Manacher+记录区间 )

Three Palindromes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 809    Accepted Submission(s): 240 Problem Description Can we divided a given string S into three nonempty palindromes? Input F

Eqs 折半枚举+二分查找 大水题

Eqs 题目抽象:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 (*),给出a1,a2,a3,a4,a5.    ai属于[-50,50]. 求有多少序列   x1,x2,x3,x4,x5 ,xi属于 [-50,50]-{0}. 思路:折半枚举+二分查找 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #inclu

poj 2785 4 Values whose Sum is 0 折半枚举

题目链接:http://poj.org/problem?id=2785 枚举的一般思路就是先把所有的状态枚举出来 最后一次性判断该状态合法不合法 而折半枚举的思想是 先枚举一半的状态 把他们的状态存起来 排序 然后再枚举剩下一般 用目标反推前一半的期望状态 接下来在前一半的结果数组中查找是否有相应结果 之所以能优化是因为结果数组有序 就可以用二分搜索 复杂度从O(n^2 * n^2) 降到 O(n^2 * log(n^2))即(O(n^2 * log n)) 二分搜索的一个技巧 在有序数组中用二

LightOj 1076 - Get the Containers (折半枚举 绝世好题)

题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1076 题目描述: 给出n个数,要求分成m段,问这m段中最大的总和,最小是多少? 解题思路: 二分每一段的长度,然后判定枚举长度是否合法. 刚看到这个题目就想到了dp,但是dp的复杂度还是很高的,然后就一直放着,放着....学了折半枚举,拿起来一看,哇塞,简直惊喜啊! 1 #include<cstdio> 2 #include<cstring> 3 #inclu