• UVA 11100 The Trip, 2007


    UVA_11000

        首先分几堆是由某个维度的背包数量的最大值决定的,有了堆数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;
    }


  • 相关阅读:
    Mac普通用户修改了/etc/sudoers文件的解决办法
    python对缓存(memcached,redis)的操作
    线程、进程、协程和队列
    python作用域和多继承
    sokect编程进阶
    socket编程基础
    python面相对象进阶
    python异常处理
    configparser模块
    subprocess模块
  • 原文地址:https://www.cnblogs.com/staginner/p/2310436.html
Copyright © 2020-2023  润新知