C. Beauty Pageant 思维+贪心
http://codeforces.com/contest/246/problem/C
题意:
给定n个数,给出k值;n, k (1 ≤ n ≤ 50; 1 ≤ 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; }