CF1348D Phoenix and Science【貪心】

題目鏈接

題目描述

給定一個數 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("");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章