• uva 10560


    题目连接:uva 10560 - Minimum Weight

    题目大意:给出n,问说至少须要多少个不同重量的砝码才干称量1~n德重量,给出所选的砝码重量,而且给出k,表示有k个重量须要用上述所选的砝码測量。

    解题思路:重量为1的砝码肯定要选,它能够表示到1的重量,那么下一个砝码的重量肯定选择3(21+1),这样1,3分别能够用一个砝码表示,而2,4分别为3-1和3+1,这样1~4的重量也都能够表示。于是有公式ai=si12+1

    #include <cstdio>
    #include <cstring>
    #include <vector>
    
    using namespace std;
    typedef unsigned long long ll;
    
    ll n, S;
    vector<ll> ans;
    
    void init (ll n) {
        S = 0;
        ans.clear();
    
        while (S < n) {
            ll u = S * 2 + 1;
            ans.push_back(u);
            S += u;
        }
        printf("%lu", ans.size());
        for (int i = 0; i < ans.size(); i++)
            printf(" %lld", ans[i]);
        printf("
    ");
    }
    
    void solve () {
        ll k, s = S;
        scanf("%lld", &k);
    
        int sign = 1, flag = 0;
        for (int i = ans.size() - 1; i >= 0; i--) {
            ll t = (s - 1) / 3;
    
            s -= ans[i];
        //    printf("%lld %lld %lld
    ", ans[i], s, k);
            if (k <= t)
                continue;
    
            if (flag) 
                printf("%c", sign > 0 ? '+' : '-');
    
            if (k < ans[i]) {
                sign *= -1;
                k = ans[i] - k;
            } else {
                k = k - ans[i];
            }
            flag = 1;
            printf("%lld", ans[i]);
        }
        printf("
    ");
    }
    
    int main () {
        int k;
        while (scanf("%lld%d", &n, &k) == 2 && n + k) {
            init(n);
            for (int i = 0; i < k; i++)
                solve();
        }
        return 0;
    }
  • 相关阅读:
    AOJ 718.计算GPA
    AOJ 11.Rails
    AOJ 592.神奇的叶子
    AOJ 10.目标柏林
    洛谷P1030求先序排列
    vijos1514天才的记忆
    洛谷2016战略游戏
    LOJ10155数字转换
    洛谷2014选课
    洛谷2015二叉苹果树
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3840943.html
Copyright © 2020-2023  润新知