糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

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;
}

posted on 2010-03-31 15:16 糯米 阅读(524) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理