UVA 11100 The Trip, 2007
2012-01-02 21:47
381 查看
UVA_11000
首先分几堆是由某个维度的背包数量的最大值决定的,有了堆数K之后,我们只要按背包的维度递增的顺序依次把每个背包按1,2,…,K,1,2…这样的顺序放到每个堆里即可,这样对于任意一个堆一定不会出现重复的背包。
首先分几堆是由某个维度的背包数量的最大值决定的,有了堆数K之后,我们只要按背包的维度递增的顺序依次把每个背包按1,2,…,K,1,2…这样的顺序放到每个堆里即可,这样对于任意一个堆一定不会出现重复的背包。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXD 10010 int a[MAXD], N, K, r[MAXD], num[MAXD], first[MAXD], next[MAXD], v[MAXD]; int cmp(const void *_p, const void *_q) { int *p = (int *)_p; int *q = (int *)_q; return *p - *q; } void init() { int i, j, k; for(i = 0; i < N; i ++) scanf("%d", &a[i]); qsort(a, N, sizeof(a[0]), cmp); r[0] = -1, k = 0; for(i = 0; i < N; i ++) { if(a[i] == r[k]) ++ num[k]; else { ++ k; num[k] = 1; r[k] = a[i]; } } K = k; } void solve() { int i, j, k, ans, e; memset(first, -1, sizeof(first)); e = ans = k = 0; for(i = 1; i <= K; i ++) if(num[i] > k) k = num[i]; i = 0; for(j = 1; j <= K; j ++) { while(num[j]) { -- num[j]; v[e] = r[j]; next[e] = first[i]; first[i] = e; e ++; i = (i + 1) % k; } } printf("%d\n", k); for(i = 0; i < k; i ++) { j = first[i]; printf("%d", v[j]); for(j = next[j]; j != -1; j = next[j]) printf(" %d", v[j]); printf("\n"); } } int main() { int t = 0; for(;;) { scanf("%d", &N); if(!N) break; init(); if(t ++) printf("\n"); solve(); } return 0; }
相关文章推荐
- UVA - 11100 The Trip, 2007
- UVA 11100 The Trip, 2007 (贪心)
- UVA - 11100 The Trip, 2007
- UVA_11100_The Trip, 2007
- UVA - 11100 The Trip, 2007(贪心)
- UVA 11100 The Trip, 2007
- uva11100 - The Trip, 2007
- uva 11100 The Trip, 2007
- uva - 11100 - The Trip, 2007(贪心)
- UVA 11100 The Trip, 2007——水题
- UVa11100 - The Trip, 2007(贪心【重点:解的构造)
- UVA 11100 The Trip, 2007
- UVA11100 The Trip, 2007(贪心)
- UVa 11100 The Trip, 2007 (题意+贪心)
- uva 11100 The Trip, 2007
- UVA 11100 - The Trip, 2007
- uva 11100 The Trip, 2007
- UVA - 11100 The Trip, 2007
- UVA 11100 The Trip,2007(贪心)
- [贪心]UVA11100 - The Trip, 2007