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. 浅谈WebLogic和Tomcat

    J2ee开发主要是浏览器和服务器进行交互的一种结构.逻辑都是在后台进行处理,然后再把结果传输回给浏览器.可以看出服务器在这种架构是非常重要的. 这几天接触到两种Java的web服务器,做项目用的Tom ...

  2. Andriod如何更改应用程序小图标

    1.之前我们安装的第一个应用图标是这样的(如下图) 2.在eclipse左侧项目中找到res文件下的drawable-hdpi         3.把自己找的LOGO图标拖到文件中,之后会弹出一个消息 ...

  3. 获取程序的SHA1值

    android获取程序的SHA1值 public static String getSHA1(Context context) { try { PackageInfo info = context.g ...

  4. FTP提示505错误解决办法

    使用ServerU建FTP服务器时,选定了锁定主文件夹,不选即可解决问题.

  5. Karma+Jasmine实现自动化单元测试

    1.Karma介绍 Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma.Karma是一个让人感到非常神秘的名字 ...

  6. CSS中定位和浮动对行内元素的宽高的影响

    行内元素的大小是由元素里面的内容撑开的宽高决定的,就算在css中对行内元素设置width,height.行内元素也会忽略宽高的设置. 但是当行内元素使用position:absolute或者posit ...

  7. java测试框架整理

    Test: Junit4+Hamcrest 不多说了,就靠着两个 import static org.hamcrest.Matchers.equalTo; import static org.juni ...

  8. 使用"关键词"来整理自己的知识库

    以前一直使用MyBase作为整理知识的工具,但是用到后来发现,当整理的知识越来越多时,树形目录的节点个数就会变得越来越庞大,层次越来越深,反而很难定位要查看或编辑的知识.最近发现使用"关键字 ...

  9. Oracle --获取绑定变量的值.

    SELECT * FROM DBA_HIST_SQLBIND WHERE SNAP_ID>67073 AND SNAP_ID<=67079 AND SQL_ID='3DR3410F086P ...

  10. CentOS7 配置网卡端口镜像

    背景 最近一直在研究旁路监测,需要设置一个源端口镜像给两个目的端口(分别接两个监测设备),无奈ip-com交换机没配置明白,研究下使用软件实现暂时代替. 环境 发行版.内核.iptables版本信息如 ...