Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) ---补题

A Slime Combining
题解:两种方法,方法一就是根据题意直接模拟,两个相同的数会消掉,并生成一个新数,新数的值是合并掉的数+1的值。还有一种方法就是用二进制,二进制的每一位上不是0就是1 ,刚好用来表示是否要输出这个数。

我的代码:

思路一丨模拟:

#include
using namespace std;
const int maxn = 100000 + 5;
int k[maxn];
int main(){int n;cin >> n;int t = 0;int cur;while(n--) {k[t] = 1;cur = t;while(cur != 0 && k[cur] == k[cur-1]) {k[cur-1] += 1;cur = cur-1;}t = cur + 1;}for(int i = 0; i < t; i++) {cout << k[i] << " ";}cout << endl;return 0;
}

复杂度O(n).

思路二丨二进制:

#include
#include
using namespace std;
const int maxl = 20;
int l[maxl];
int main() {int n;cin >> n;int t = 1;int c = 0;memset(l, 0, sizeof(l));while(n) {c = n&1;n >>= 1;if(c) l[t] = t;t++;}for(int i = t-1; i >= 1; i--) {if(l[i])cout << l[i] << " ";}cout << endl;cout << endl;return 0;
}

复杂度O(lgn).


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部