C. Beauty Pageant 思维+贪心

http://codeforces.com/contest/246/problem/C

题意:

给定n个数,给出k值;nk (1 ≤ n ≤ 501 ≤ k ≤  )  求出k个不同的数,这些数是由n个不同的数里面选出来组合成的。这里保证有解,并且n个数不同。

思路:

做CF真心考思维啊,大牛们几分钟秒杀的题目,自己还是没有想出来。自己做的题目数量还是太少。

想暴利搞搞来,一看2^50次方搞个毛啊。。一直没能想出什么好办法来。

赛后一看别人的代码才恍然大悟,注意k的取值,我们是否想到了n + n -1 + n - 2 + ...... + 1是的,解决的关键就在这。

我们把n个数从大到小排序,枚举一下组合中数的个数i,然后用i - 1个能组合出来的最大值分别于其余的数组和,这样组和出来的数肯定不同而且是递增。而且最大我们能够得到n + n -1 + ... + 1 个数,所以满足条件。

关键在于从小到大的顺序的吧可能的组和输出....思维啊...

By E_star, contest: Codeforces Round #151 (Div. 2), problem: (C) Beauty Pageant, Accepted, #
 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)

#define ll long long
#define inf 0x7f7f7f7f
#define MOD 1073741824
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 107
#define N 57
using namespace std;
//freopen("din.txt","r",stdin);

int n,k;

int a[N],b[N];

int main()
{
    int i,j;
    while (~scanf("%d%d",&n,&k))
    {
        for (i = 0; i < n; ++i)
        {
            scanf("%d",&a[i]);
            b[i] = a[i];
        }
        sort(a,a + n); sort(b,b + n);
        reverse(b,b + n);

        for (i = 1; i <= n; ++i)
        {
            int tmp = n - i + 1;
            int r = 0;
            while (tmp)
            {
                printf("%d",i);
                for (j = 0; j < i - 1; ++j) printf(" %d",b[j]);
                printf(" %d",a[r]); r++;
                printf("\n");
                tmp--;
                k--;
                if (k == 0) break;
            }
            if (k == 0) break;
        }
    }
    return 0;
}

  

 

 

 

posted @ 2012-11-23 20:05  E_star  阅读(332)  评论(0编辑  收藏  举报