标签:style http color width os for
题目连接:uva 10560 - Minimum Weight
题目大意:给出n,问说至少需要多少个不同重量的砝码才能称量1~n德重量,给出所选的砝码重量,并且给出k,表示有k个重量需要用上述所选的砝码测量。
解题思路:重量为1的砝码肯定要选,它可以表示到1的重量,那么下一个砝码的重量肯定选择3(2?1+1),这样1,3分别可以用一个砝码表示,而2,4分别为3-1和3+1,这样1~4的重量也都可以表示。于是有公式ai=si?1?2+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("\n");
}
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\n", 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("\n");
}
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;
}
uva 10560 - Minimum Weight(数论),布布扣,bubuko.com
uva 10560 - Minimum Weight(数论)
标签:style http color width os for
原文地址:http://blog.csdn.net/keshuai19940722/article/details/36868447