題目描述
給定一個數 x = 1,初始sum = 1,每次可對x進行操作,將其值變爲[x, x * 2]之間的任意一個數,然後將sum加上現在的x,問最少需要幾次操作可以變成給定的數字n,同時對於每次操作輸出 x 的改變量。
思路
要達到最少次數,貪心的想每次肯定加上最多的量 x * 2,然而每次最少加上變化過的x,所以最後一次加的數可能小於當前的x,但是沒關係,可以讓這次加上的那個小於x的數儘可能的往前移直到前一個數小於等於它,然後按照順序求一遍答案即可。
具體看代碼就通俗易懂了。
代碼
void solve() {
int n;
scanf("%d", &n);
vector<int> v;
int x = 1;
while(n > 0) {
if(n > x) v.push_back(x);
else v.push_back(n);
n -= x;
x <<= 1;
}
sort(v.begin(), v.end());
printf("%d\n", v.size() - 1);
for(int i = 1; i < v.size(); i++) {
printf("%d ", v[i] - v[i - 1]);
}
puts("");
}