Jersey Politics
poj2454:http://poj.org/problem?id=2454
题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k。
题解:这道题一开始我并不知道怎么做,准备采用随机算法,初始化的时候使其分成3堆,然后每次从每一堆中rand一个数,依次的进行交换,但是交了几版,发现都是wa。最后
才知道要用贪心。把数字进行降序排序,然后把前2*k个给两堆,只要前两堆都满足大于500*k,如果不满足,那么对于更小的数的组合就不可能满足了。然后最前两堆进行随机算法
每次rand一个,然后相互交换,找到满足条件的即可!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int kind[];
int k,timelimit;
int sum1,sum2;
struct Node {
int w;
int id;
}node[];
int cmp(Node a,Node b ){
return a.w>b.w;
}
int main(){
scanf("%d",&k);
sum1=sum2; int t;
timelimit=;memset(kind,,sizeof(kind));
for(int i=;i<=*k;i++){
scanf("%d",&node[i].w);
node[i].id=i;
}
sort(node+,node+*k+,cmp);
for(int i=;i<=*k;i++){
if(i<=k){
kind[i]=;
sum1+=node[i].w;
}
else if(i<=*k){
kind[i]=;
sum2+=node[i].w;
}
}
if(sum1>*k&&sum2>*k)t=;
else t=timelimit*;
while(t--){
int a,b;
while(true){
a=rand()%(*k)+;
if(kind[a]==)break;
}
while(true){
b=rand()%(*k)+;
if(kind[b]==)break;
}
sum1+=node[b].w-node[a].w,kind[a]=;
sum2+=node[a].w-node[b].w,kind[b]=;
if(sum1>*k&&sum2>*k)break;
}
for(int i=;i<=*k;i++)
if(kind[i]==)printf("%d\n",node[i].id);
for(int i=;i<=*k;i++)
if(kind[i]==)printf("%d\n",node[i].id);
for(int i=;i<=*k;i++)
if(kind[i]==)printf("%d\n",node[i].id); }
Jersey Politics的更多相关文章
- 【数学】Jersey Politics
Jersey Politics Time Limit: 1000MS Memory ...
- POJ2454——Jersey Politics
POJ2454——Jersey Politics 题目大意: 在泽西奶牛和荷斯坦奶牛的最新普查中,威斯康星奶牛在谷仓中获得了三个档位. 泽西奶牛目前控制着国家重新分配委员会. 他们想将国家分为三个相当 ...
- POJ2454 Jersey Politics
Description In the newest census of Jersey Cows and Holstein Cows, Wisconsin cows have earned three ...
- [USACO2005][POJ2454]Jersey Politics(随机化)
题目:http://poj.org/problem?id=2454 题意:给你3*k(k<=60)个数,你要将它们分成3个长度为k的序列,使得其中至少有两个序列的和大于k*500 分析:以为有高 ...
- poj 2454 Jersey Politics 随机化
随机化算法+贪心! 将3*k排序后分成3分,将第二第三份的和分别加起来,让和与500*k比较,都大于则输出,否则,随机生成2个数,在第二第三份中交换! 代码如下: #include<iostre ...
- poj 2454 Jersey Politics dfs
这个题目第一步还是比较明显的,先把最小的n个值去掉,剩下的问题就是能不能把数据分成两半,使得每一半和都大于n*500,这个刚开始考虑了下dp的做法,但是复杂度不满足要求. 那么能想到的就是搜索了,实际 ...
- POJ.2454.Jersey Politics(随机化算法)
题目链接 \(Description\) 将长为\(3n\)的序列划分成\(3\)个子序列,要求至少有两个子序列的和都\(\geq 500*n\),输出任一方案.保证有解. \(Solution\) ...
- 【POJ】2454.Jersey Politics
题解 有种迷一样的讽刺效果 每个城市有1000头牛,然后你现在知道对于自己政党每个城市的选票,把城市划分成三个州,保证在至少两个州内获胜 找出前2K大的然后random_shuffle,直到前K个加起 ...
- 浅浅地谈一下随机算法【poj2454】【poj3318】
随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
随机推荐
- Android 图标上面添加提醒(一)使用Canvas绘制
版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发一些如通讯录.社交等应用或者应用添加新功能模块时,会考虑在对应的图标上加上未读信息的数量,或者是新功能提醒的图标,这样不占太大空间还能达 ...
- iscsi介绍及iscsi target配置
iSCSI 主要是透过 TCP/IP 的技术,将储存设备端透过 iSCSI target (iSCSI 目标) 功能,做成可以提供磁盘的服务器端,再透过 iSCSI initiator (iSCSI ...
- eslint error
暂时不想解决 报错: 3:16 error Component should be written as a pure function react/prefer-stateless-function ...
- 咱也玩玩Wordpress
博客暂时转移到了 -> www.zhyfzy.ga 域名改成.com啦 -> www.zhyfzy.com
- PL/SQL 批量SQL
批量SQL包括: FORALL语句 BULK COLLECT子句 FORALL语句 FORALL具有如下结构: FORALL loop_counter IN bounds_clause [SAVE E ...
- js获取上一个月、下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- There is no ID/IDREF binding for IDREF
http://blog.csdn.net/greensurfer/article/details/7596219
- XFire构建服务端Service的两种方式(转)
XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...
- BeanUtils的日期问题
//注册日期类型转换器 //第一种 自定义方法 ConvertUtils.register(new Converter(){ //第一个参数是目标 ...
- asp.net中后台javaScrip的使用
ClientScriptManager csm = Page.ClientScript; //Script标记靠近<form>标签 //csm.Register ...