poj 2454 Jersey Politics 随机化
随机化算法+贪心!
将3*k排序后分成3分,将第二第三份的和分别加起来,让和与500*k比较,都大于则输出,否则,随机生成2个数,在第二第三份中交换!
代码如下:
#include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> using namespace std; struct an { int w,lab; }p[200]; bool cmp(const an &a,const an &b) { return a.w<b.w; } int main() { int i,j,n,sa,sb,ans,a,b; cin>>n; for(i=0;i<3*n;i++){ cin>>p[i].w; p[i].lab=i+1; } sort(p,p+3*n,cmp); sa=0;sb=0; for(i=n;i<n+n;i++) sa+=p[i].w; for(i=n+n;i<3*n;i++) sb+=p[i].w; ans=n*500; bool flag=0; if(sa>ans&&sb>ans) flag=1; while(!flag){ a=rand()%n+n; b=rand()%n+2*n; sa=sa-p[a].w+p[b].w; sb=sb-p[b].w+p[a].w; swap(p[a],p[b]); if(sa>ans&&sb>ans){ flag=1; break; } } for(i=0;i<3*n;i++) cout<<p[i].lab<<endl; return 0; }