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 << '
';
}
else {
int flag = 1;
for (int i = 1; i < m; i += 2) {
if (!((tmp[i] - '0') % 2))flag = 2;
}
cout << flag << '
';
}
}
}
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<<'
';
}
}
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 << '
';
else if (flag1 == 1 || sum == x * n)cout << 1 << '
';
else cout << 2 << "
";
}
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] << ' ';
}