Codeforces Round 958 (Div. 2)


这是我第一次正式打codeforces,可能一开始比较紧张第一题一直过不了,心态就炸了后来就有点力不从心了,有点摆吧,下一次打一定要认真对待

题目链接

A. Split the Multiset

思路

这个题就是要把n改成n个1,我么们不用管题目上怎么分解的,只需要把每次分解成k-1个1和n-k+1就行

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int t;

signed main() {
	IOS
	cin >> t;
	while (t--) {
		int n, k;
		cin >> n >> k;
		if (n == 1)
			cout << 0 << endl;
		else {
			int sum = 0;
			while (n > k) {
				sum++;
				n = n - k + 1;
			}
			cout << sum + 1 << endl;
		}
	}
	return 0;
}

B. Make Majority

题意

这个题意思就是可以让l到r中的数合并成一个其中的数,当区间中1的个数大于0的个数就和并成1,反之合并成0,看最后是否能合并成只有一个1

思路

我们可以把连续的几个零合并成一个,然后看合并后的0和1的个数,如果1多就能合并反之则不能

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int t;

signed main() {
	IOS
	cin >> t;
	string s;
	int a;
	while (t--) {
		int x = 0, y = 0;
		cin >> a >> s;
		for (int i = 0; i < a; i++) {
			if (s[i] == '0') {
				x++;
				while (s[i + 1] == '0')
					i++;
			} else
				y++;
		}
		if (y > x)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}

C. Increasing Sequence with Fixed OR

题意

就是要构建一个递增数列并且an|an-1=n

思路

根据我的理解,就是要把原数字的二进制上的数字1换成零,例如23的二进制10111。后续的数字如果要符合条件就要在10111有1的地方换成0.例如10110,10101之类的。这时就要考虑如何将1换掉了。利用二进制的特点,用23不断除以二,判断是否是奇数(因为只有除以2为奇数,二进制上才为1),是奇数的话,就可以减去2n (这样可以直接将二进制上的1变成0)。最后逆序输出

代码

#include <iostream>
#define int long long
using namespace std;
int t, m[1000100];

signed main() {
	cin >> t;
	while (t--) {
		int a;
		cin >> a;
		if (a == 1 || a == 2) {
			cout << 1 << endl << 1 << endl;
			continue;
		}
		int b = a, pow = 1, cnt = 0;
		m[0] = a;
		while (b) {
			if (b % 2 != 0) {
				m[++cnt] = a - pow;
			}
			b /= 2;
			pow *= 2;
		}
		if (m[cnt] == 0) {
			cout << 1 << endl << a << endl;
			continue;
		}
		cout << cnt + 1 << endl;
		for (int i = cnt; i >= 0; i--)
			cout << m[i] << " ";
		cout << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值