1 条题解

  • 1
    @ 2025-4-5 16:55:22

    题意:

    给定2020个砝码,重量分别为3ii=0 19)3^i(i=0~19)。给定一个物品,质量为W1<=W<=(3201)/2W(1 <= W <= (3^20-1)/2),放在天平左盘。左右皆可放砝码,如何放能使天平平衡。

    思路:

    将物品的重量转化为三进制,如果某一位为00或者11则不需处理、为22便在此位加上相应的33的幂将22消除,并进位。最终得到的每位都为00或者11的数即为最终天平右端的重量。

    标程

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    #define N 25
    
    int n, T;
    int num[N], res[N];
    
    void print(int s[N], int len) {
        int i, flag = 0;
        for (i = 0; i <= len; i++) {
            if (!flag && s[i]) {
                printf("%d", (int)pow(3, i));
                flag = 1;
            } else if (s[i]) {
                printf(",%d", (int)pow(3, i));
            }
        }
        if (!flag) {
            printf("empty");
        }
    }
    
    int main() {
        int i, len;
        scanf("%d", &T);
        while (T--) {
            len = 0;
            memset(num, 0, sizeof(num));
            memset(res, 0, sizeof(res));
            scanf("%d", &n);
            while (n) { // 将输入数字转化为 3 进制
                num[len++] = n % 3;
                n /= 3;
            }
            for (i = 0; i < len; i++) {
                if (num[i] >= 2) { // 出现 2(或 3)
                    if (num[i] == 2) { // 此位为 2 表示在这位上加上一个相应的 3 的幂
                        res[i] = 1;
                    }
                    num[i] = 0;
                    num[i + 1]++;
                }
            }
            print(res, len);
            printf(" ");
            print(num, len); // num 数组恰为最终天平两端的重量
            putchar('\n');
        }
        return 0;
    }    
    
    
    • 1

    信息

    ID
    703
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者