Codeforces Round #671 Div. 2

A. Digit Game

给定一串数字,A和B轮流选数,A只能选奇数位的,B只能选偶数位的,最后一个数是奇数A胜,否则B胜。

判断数字长度的奇偶性,判断即可。

因为我菜的一批导致没有搞定取非的优先级FST了 我爬爬爬爬爬
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include<vector>
#include<iomanip>
#include<map>
#include<queue>
#include<stack>
#define lc(i) (2*i+1)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
int n;
stack<long long>up, down;
ll dataa[1000000 + 5];
ll dp[1000000 + 5];
int main() {
	cin >> n;
	while (n--) {
		ll m;
		cin >> m;
		string tmp;
		cin >> tmp;
		if (m & 1) {
			int flag = 2;
			for (int i = 0; i < m; i += 2) {
				if ((tmp[i] - '0') % 2)flag = 1;
			}
			cout << flag << '\n';
		}
		else {
			int flag = 1;
			for (int i = 1; i < m; i += 2) {
				if (!((tmp[i] - '0') % 2))flag = 2;
			}
			cout << flag << '\n';
		}
	}
}



B. Stairs

这鬼东西看题看了半年。。

其实就是规定宽为1,1+2,1+2+4。。。。。等为一个好的阶梯

然后问给定一定的空格,最多能做多少个不重复的阶梯

观察数据,1e18时结果为30,我们只要处理到前30个这种阶梯各自需要多少方格,然后从小到大贪心即可。

开ll正好不会爆

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include<vector>
#include<iomanip>
#include<map>
#include<queue>
#include<stack>
#define lc(i) (2*i+1)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
int n;
stack<long long>up,down;
ll dataa[31];
int main() {
	cin >> n;
	ll tmp = 1,pow=2;
	for (int i = 0; i < 31; i++) {
		dataa[i] = tmp * (tmp + 1) / 2;
		tmp += pow;
		pow *= 2;
	}
	while (n--) {
		ll m;
		cin >> m;
		ll ans = 0;
		while (m>0)
		{
			if (m - dataa[ans] >= 0) { m -= dataa[ans]; ans++; }
			else break;
		}
		cout << ans<<'\n';
	}
}


C. Killjoy

给定最初被感染账号的rating,和其他所有账号的rating,只要有正常账号rating和被感染的一致,就会被感染,出了最出被感染的账号外,其他账号都可以一起改变,且每次所有账号改变之和为0,问最少要多少次这种改变,所有账号都被感染。

有以下几种情况

  • 大家都和被感染账号rating一致,直接0次
  • 和的平均值==初始rating,让所有账号都变为初始rating,1次
  • 存在1个或以上直接被感染的账号,那么我们可以这样改变:将其他未感染账号rating改为和初始账号一致,1次
  • 其他情况,先改变让一个账号被感染,之后同上一个情况,2次
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include<vector>
#include<iomanip>
#include<map>
#include<queue>
#include<stack>
#define lc(i) (2*i+1)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
int n;
stack<long long>up,down;
ll dataa[300000] = {};
void solve() {
	ll x,n;
	cin >> n >> x;
	ll sum=0, flag1 = 0, flag2 = 1;;
	for (int i = 0; i < n; i++) {
		scanf("%lld", &dataa[i]);
		sum += dataa[i];
		if (dataa[i] == x)flag1 = 1;
		else flag2 = 0;
	}
	if (flag2 == 1)cout << 0 << '\n';
	else if (flag1 == 1 || sum == x * n)cout << 1 << '\n';
	else cout << 2 << "\n";
}
int main() {
	cin >> n;
	
	while (n--) {
		solve();
	}
}

D1&D2. Sage's Birthday

当一个商品小于左边和右边的价格,我们就能购买它,问如何排列商品能让我们能买的最多

排序,从小到大放偶数位置,剩下从小到大放奇数位置,D2加个左右相等的特判即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include<vector>
#include<iomanip>
#include<map>
#include<queue>
#include<stack>
#define lc(i) (2*i+1)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
int n;
stack<long long>up,down;
ll dataa[300000] = {};
ll ans[300000] = {};
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)scanf("%lld", &dataa[i]);
	sort(dataa+1, dataa+1 + n);
	ll anss = 0;
	for (int i = 1,j=1; i <= ((n&1)?n+1:n); i += 2,j++) {
		ans[i+1] = dataa[j];
		ans[i] = dataa[j+n/2];
	}
	for (int i = 2; i < n; i++)if (ans[i - 1] > ans[i] && ans[i + 1] > ans[i])anss++;
	cout << anss << endl;
	//ans[n] = dataa[n];
	for (int i = 1; i <= n; i++)cout << ans[i] << ' ';
}

posted @ 2020-09-20 23:11  PopHirasawa  阅读(396)  评论(0编辑  收藏  举报