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. [Android]用图库打开指定的文件夹,没错是第一个画面直接是图库的文件夹画面

    参考了这个里面的代码 http://bbs.csdn.net/topics/380084274 一直报错 06-16 23:58:50.698 26148-26161/com.example.myap ...

  2. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  3. shape

    <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...

  4. jmeter jar包

    jmeter jar包下载地址: http://cn.jarfire.org/ApacheJMeter.html 放在 jmeter /lib目录下

  5. rabbitmq之消息重入队列

    说起消息重入队列还得从队列注册消费者说起,客户端在向队列注册消费者之后,创建的channel也会被主队列进程monitor,当channel挂掉后,主队列进程(rabbit_amqqueue_proc ...

  6. shell (check return of each line)and sudoer

    shell result from cmdline echo $? if 0 then success ;else failure (shell 执行每部返回值,rm -rf 错误,打包不能覆盖) 解 ...

  7. mvc配合jquery.validate验证失效,情况之一

    用viewbage绑定input空间的value值,通过submit提交.validate验证失效. 1.应该是mvc的渲染顺序导致js验证失败. 解决方案:改用mvc自带的@html辅助方法,生成文 ...

  8. Apple Reject

    2016年11月10日 上午1:15 发件人 Apple 2. 1 PERFORMANCE: APP COMPLETENESS Thank you for your resubmission. Per ...

  9. JMeter学习-024-JMeter 命令行(非GUI)模式详解(二)-执行代理设置

    闲话少述,接 上文 继续... 5.设置代理 jmeter -n -t JMeter分布式测试示例.jmx -H 20.9.215.90 -P 9999 -l report\01-result.csv ...

  10. ACM集训的1B。。。。黑色星期五。。。。2333333

    题目: 印象中有好多个13号是星期五,13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900 ...