Jersey Politics
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5592   Accepted: 1413   Special Judge

Description

In the newest census of Jersey Cows and Holstein Cows, Wisconsin cows have earned three stalls in the Barn of Representatives. The Jersey Cows currently control the state's redistricting committee. They want to partition the state into three equally sized voting districts such that the Jersey Cows are guaranteed to win elections in at least two of the districts.

Wisconsin has 3*K (1 <= K <= 60) cities of 1,000 cows, numbered 1..3*K, each with a known number (range: 0..1,000) of Jersey Cows. Find a way to partition the state into three districts, each with K cities, such that the Jersey Cows have the majority percentage in at least two of districts.

All supplied input datasets are solvable.

Input

* Line 1: A single integer, K

* Lines 2..3*K+1: One integer per line, the number of cows in each city that are Jersey Cows. Line i+1 contains city i's cow census.

Output

* Lines 1..K: K lines that are the city numbers in district one, one per line

* Lines K+1..2K: K lines that are the city numbers in district two, one per line

* Lines 2K+1..3K: K lines that are the city numbers in district three, one per line

Sample Input

2
510
500
500
670
400
310

Sample Output

1
2
3
6
5
4

Hint

Other solutions might be possible. Note that "2 3" would NOT be a district won by the Jerseys, as they would be exactly half of the cows.
 
试题分析:
    我们可以想到把数组排一个序,然后取前2k个,分到S1、S2中去
    设S=(S1,S2)
    那么我们持续随机排序S,最终在满足条件时输出答案
  
    上面的策略固然能解决这个问题,但是随即排序S时间浪费太大
    那么我们要怎样呢?
    我们可以随机交换S1,S2中的元素,然后直到满足条件就可以了
 
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<time.h>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
struct data{
int num,k;
}a[200],s1[61],s2[61],s3[61];//S1 S2满足条件
bool cmp(data a,data b){
return a.num>b.num;
}
int N;
bool judge(){
int sum=0,sum2=0;
for(int i=1;i<=N/3;i++) sum+=s1[i].num;//S1 sum
for(int i=1;i<=N/3;i++) sum2+=s2[i].num;
if(sum2>500*(N/3)&&sum>500*(N/3)) return true;
return false;
}
void change(){
//srand((unsigned int)time(0));加上这个POJ会给你显示RE
int tmp1=rand()%(N/3)+1;
int tmp2=rand()%(N/3)+1;
swap(s1[tmp1].num,s2[tmp2].num);
swap(s1[tmp1].k,s2[tmp2].k);
}
void print(){
for(int i=1;i<=N/3;i++) cout<<s1[i].k<<endl;
for(int i=1;i<=N/3;i++) cout<<s2[i].k<<endl;
for(int i=1;i<=N/3;i++) cout<<s3[i].k<<endl;
}
int main(){
N=read(),N*=3;
for(int i=1;i<=N;i++) a[i].num=read(),a[i].k=i;
sort(a+1,a+N+1,cmp); for(int i=1;i<=N/3;i++) //划分前k大到S1
s1[i].num=a[i].num,s1[i].k=a[i].k;
for(int i=N/3+1;i<=2*(N/3);i++) //划分前K+1~前2K大到S2
s2[i-N/3].num=a[i].num,s2[i-N/3].k=a[i].k;
for(int i=2*(N/3)+1;i<=N;i++)
s3[i-2*(N/3)].num=a[i].num,s3[i-2*(N/3)].k=a[i].k; while(!judge()) change();
print();
}

  

【数学】Jersey Politics的更多相关文章

  1. POJ2454——Jersey Politics

    POJ2454——Jersey Politics 题目大意: 在泽西奶牛和荷斯坦奶牛的最新普查中,威斯康星奶牛在谷仓中获得了三个档位. 泽西奶牛目前控制着国家重新分配委员会. 他们想将国家分为三个相当 ...

  2. POJ2454 Jersey Politics

    Description In the newest census of Jersey Cows and Holstein Cows, Wisconsin cows have earned three ...

  3. [USACO2005][POJ2454]Jersey Politics(随机化)

    题目:http://poj.org/problem?id=2454 题意:给你3*k(k<=60)个数,你要将它们分成3个长度为k的序列,使得其中至少有两个序列的和大于k*500 分析:以为有高 ...

  4. poj 2454 Jersey Politics 随机化

    随机化算法+贪心! 将3*k排序后分成3分,将第二第三份的和分别加起来,让和与500*k比较,都大于则输出,否则,随机生成2个数,在第二第三份中交换! 代码如下: #include<iostre ...

  5. Jersey Politics

    poj2454:http://poj.org/problem?id=2454 题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k.题解:这道题一开始我并不知道怎么做, ...

  6. poj 2454 Jersey Politics dfs

    这个题目第一步还是比较明显的,先把最小的n个值去掉,剩下的问题就是能不能把数据分成两半,使得每一半和都大于n*500,这个刚开始考虑了下dp的做法,但是复杂度不满足要求. 那么能想到的就是搜索了,实际 ...

  7. POJ.2454.Jersey Politics(随机化算法)

    题目链接 \(Description\) 将长为\(3n\)的序列划分成\(3\)个子序列,要求至少有两个子序列的和都\(\geq 500*n\),输出任一方案.保证有解. \(Solution\) ...

  8. 【POJ】2454.Jersey Politics

    题解 有种迷一样的讽刺效果 每个城市有1000头牛,然后你现在知道对于自己政党每个城市的选票,把城市划分成三个州,保证在至少两个州内获胜 找出前2K大的然后random_shuffle,直到前K个加起 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. ADT Ubuntu X64 下ia32-libs替换等【待编辑】

    sudo apt-get install ia32-libs apt-get install libglib2.0-0:i386 libpng12-0:i386 libsm6:i386 libxren ...

  2. linux常用命令(四)

    1.压缩解压命令 gzip命令 默认为.gz格式文件 1.只能压缩文件不可压缩目录 2.不保留源文件 压缩   giz 解压   gunip tar命令 -c产生打包文件 -v显示相信打包压缩过程 - ...

  3. pict(Pairwise Independent Combinatorial Testing)工具使用

    PICT工具就是在微软公司内部使用的一款成对组合的命令行生成工具,现在已经对外提供,可以在互联网上下载到. 要把输入类型和其对应的参数输入到一个CSV格式(CSV: 以逗号分割的纯文本文件,不带有任何 ...

  4. 浅析Java中CountDownLatch用法

    http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315652.html

  5. js 函数返回函数

    <script> var aa = function(fn, time, interval){ return function(){ if (typeof(fn) != 'function ...

  6. python学习道路(day3note)(元组,字典 ,集合,字符编码,文件操作)

    1.元组()元组跟列表一样,但是不能增删改,能查.元组又叫只读列表2个方法 一个 count 一个 index2.字典{}字典是通过key来寻找value因为这里功能比较多,所以写入了一个Code里面 ...

  7. QQ战场形势图

    真是没什么可说,全面开战,无坚不摧,活脱脱一个中央帝国.只有极少的方向处于守势.本来对腾讯也没什么特别的感觉,但是看了这张图,真是让人热血沸腾. 如果美国的公司能像腾讯做的这么大相当于:faceboo ...

  8. AngularJS基础知识2

    一.angularJS双向数据绑定 利用双向数据绑定,不仅能把数据模型的变化同步到视图上面,还可以利用双向数据绑定的特性来做一些样式上面的控制. 双向数据绑定用处很多,不仅仅是像知识点1中的那个例子, ...

  9. 5.首次登陆与在线求助man page

    X Window与命令行模式的切换:通常我们也称命令行模式为终端界面(terminal或console),linux默认的情况下会提供6个Terminal来让用户登录,切换的方式为使用[Ctrl]+[ ...

  10. Linux下查看Nginx安装目录、版本号信息?

    Linux环境下,怎么确定Nginx是以那个config文件启动的? 输入命令行: ps  -ef | grep nginx 摁回车,将出现如下图片: master process 后面的就是 ngi ...