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;
}
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3234655.html