Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4231 | Accepted: 1022 | Special Judge |
Description
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
* 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 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
Source
#include<iostream>
#include<cstring>
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
#define MAX 200
struct node
{
int v;
int id;
}a[MAX];
bool cmp(node a,node b)
{
return a.v>b.v;
}
int main()
{
int k;
while(scanf("%d",&k)!=EOF)
{
int i;
for(i=1;i<=3*k;i++)
{
scanf("%d",&a[i].v);
a[i].id=i;
}
sort(a+1,a+3*k+1,cmp);
int s1=0,s2=0;
for(i=1;i<=k;i++)
{
s1+=a[i].v;
s2+=a[i+k].v;
}
srand((int)(time(0)));
while(true)
{
if(s1>500*k && s2>500*k)
break;
int id1=rand()%k+1;
int id2=rand()%k+1+k;
if(a[id1].v <a[id2].v&&s1<s2||a[id1].v>a[id2].v&&s1>s2)
{
s1+=a[id2].v-a[id1].v;
s2+=a[id1].v-a[id2].v;
node tp;
tp=a[id2];
a[id2]=a[id1];
a[id1]=tp;
}
}
for(i=1;i<=k;i++)
{
printf("%d\n",a[i].id);
}
for(i=k+1;i<=2*k;i++)
{
printf("%d\n",a[i].id);
}
for(i=2*k+1;i<=3*k;i++)
{
printf("%d\n",a[i].id);
}
}
}
//16MS
贪心+随机化