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.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
随机推荐
- MVC ASPX(webForm)视图引擎 <%:%> 与<%=%>的差别
控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...
- linux device driver —— 环形缓冲区的实现
还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...
- mac tips
1. Mac Terminal color for different types 在 ~ 先建立一个文件 ~/.bash_profile 加入下面的两行:export CLICOLOR=1expo ...
- mysql 操作指令笔记
设置区分大小写: 打开my.ini,最后加入: [mysqld] lower_case_table_names=2 (2表示区分大小写,但仅限于字段,数据库名.表名.存储过程名都是小写的) 查看方法: ...
- 9.20 noip模拟试题
Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...
- HTML5 TypeArray和Unicode 字符之间转换
1.Uint32Array测试成功 // Uint32Array 测试成功 //字符串转为ArrayBuffer对象 function strToab() { var str = '张三丰'; var ...
- 115个Java面试题和答案——终极列表
from http://www.importnew.com/10980.html#collection http://www.importnew.com/11028.html 下面的章节分为上下两篇, ...
- I/O多路复用之poll
poll函数和select函数非常相似,但是函数接口不一样. #include <poll.h> int poll(struct pollfd *fdarray, unsigned lon ...
- QT QSettings 操作(导入导出、保存获取信息)*.ini文件详解
1.QSettings基本使用 1.1.生成.ini文件,来点实用的代码吧. QString fileName;fileName = QCoreApplication::applicationDirP ...
- Vijos1675 NOI2005 聪聪和可可 记忆化搜索
简单题,结果因为理解错题意懵逼了好久…… moveTo[x][y]表示聪聪在节点x,可可在节点y时,聪聪下一步应到达哪一个节点 dp[x][y]表示聪聪在节点x,可可在节点y,且轮到可可行动时,所需时 ...