POJ 2454 Jersey Politics 随机

POJ 2454 Jersey Politics 随机

思路:

首先按照 J牛 的数量排序,最小的前 K 个肯定是一个组了。反正这组都是输的,多烂都行。
剩下的 2K 个元素,和肯定是超过 2K*500 的。问题就是要划分一下,让每个组的和都大于 K*500。
这里没有说一定要平均分,也没说要满足什么其他特殊条件,而且数据又特别小。
所以就可以随机的分别挑选两个元素交换,然后看是否满足条件了。

代码居然 0MS AC了,随机的威力很大啊,只是不可能题题都用罢了。。

#include  < stdio.h >
#include 
< stdlib.h >
#include 
< math.h >

int  K,  in [ 256 ],  * ptr[ 256 ];

int  cmp( const   void   * a,  const   void   * b)
{
    
return *(*(int **)a) - *(*(int **)b);
}


__inline 
void  swap( int   ** a,  int   ** b)
{
    
int *= *a;
    
*= *b;
    
*= t;
}


int  main()
{
    
int i, sa, sb, a, b;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d"&K);
    
for (i = 0; i < 3*K; i++{
        scanf(
"%d"&in[i]);
        ptr[i] 
= &in[i];
    }

    qsort(ptr, 
3*K, sizeof(ptr[0]), cmp);

    sa 
= 0;
    
for (i = K; i < 2*K; i++)
        sa 
+= *ptr[i];
    sb 
= 0;
    
for (i = 2*K; i < 3*K; i++)
        sb 
+= *ptr[i];
    
while (1{
        a 
= (rand() % K) + K;
        b 
= (rand() % K) + 2*K;
        sa 
= sa - *ptr[a] + *ptr[b];
        sb 
= sb - *ptr[b] + *ptr[a];
        swap(
&ptr[a], &ptr[b]);
        
if (sa > 500*&& sb > 500*K)
            
break;
    }


    
for (i = 0; i < 3*K; i++)
        printf(
"%d\n", ptr[i] - in + 1);
    
    
return 0;
}

你可能感兴趣的:(POJ 2454 Jersey Politics 随机)