zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    设计模式-享元模式
    设计模式-外观模式
    设计模式-桥接模式
    设计模式-适配器模式
    设计模式-代理模式
    java设计模式中用到的UML图
    VS code 初次安装配置
    CMD部分操作、BAT、以及VS SQL部分快捷键
    网络部分
    CMD 中certutil 操作命令
  • 原文地址:https://www.cnblogs.com/staginner/p/2310436.html
Copyright © 2011-2022 走看看