標籤:style http color os width art
題目串連: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;}