A
给定三个整数 a 、 b 和 c 使得这两个等式恰好有一个为真:
- a+b=c
- a−b=c
如果第一个方程为真,则输出 +,否则输出 -。
#include <bits/stdc++.h>
using namespace std;
void solve(){
int a, b, c;
cin >> a >> b >> c;
cout << (a + b == c ? "+" : "-") << endl;
}
int main()
{
freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while(_t -- ){
solve();
}
return 0;
}
B
把所有偶数糖果都放前面,为了保证 Mihai will have strictly more candies than Bianca,偶数之和必须大于奇数之和,否则就输出NO
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
int a = 0, b = 0;
while (n--)
{
int x;
cin >> x;
if (x % 2 == 0) b += x;
else a += x;
}
cout << (b > a ? "YES" : "NO") << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while (_t--) {
solve();
}
return 0;
}
C
如果有两个相同的字母,它们下标之差为奇数,就输出NO,反之YES
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;
string s;
cin >> n >> s;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < i; j ++ )
if(s[i] == s[j] && (i - j) & 1)
{
puts("NO");
return;
}
puts("YES");
}
int main()
{
freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while(_t -- ){
solve();
}
return 0;
}
D
题目只在意数的奇偶性,所有存数组时可以只存奇偶,res为整个数组和的奇偶性,下面的每个操作,如果把
L~R
中的数换成奇数,res加上区间内零的个数如果换成偶数,res减去区间内一的个数,在判断res的奇偶性
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int s[N];
void solve(){
int n, q;
cin >> n >> q;
for(int i = 1; i <= n; i ++ )
{
int x;
cin >> x;
s[i] = x & 1;
s[i] += s[i - 1];
}
while(q -- )
{
int res = s[n] & 1;
int l, r, k;
cin >> l >> r >> k;
if(k & 1) res ^= (r - l + 1) - (s[r] - s[l - 1]);
else res ^= s[r] - s[l - 1];
cout << (res & 1 ? "YES" : "NO") << endl;
}
}
int main()
{
freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while(_t -- ){
solve();
}
return 0;
}
E
此题二分模板题,算一段区间和的时候记得初始化前缀和难在它是交互问题,不适应输入输出的方式
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] += a[i - 1];
}
int l = 1, r = n;
while (l < r)
{
int mid = l + r >> 1;
cout << "?" << " " << mid - l + 1 << " ";
for (int i = l; i <= mid; i++)
cout << i << " ";
cout << endl << endl;
int x;
cin >> x;
if (x != a[mid] - a[l - 1]) r = mid;
else l = mid + 1;
}
cout << "! " << r << endl;
}
int main()
{
freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while (_t--)
{
solve();
}
return 0;
}
F
模拟,就遇到边界就拐弯,找到终点退出有人可能会疑惑,为什么要循环
2*n*m
次,明明只有n*m
个格子啊有可能终点在球后面,而球初始移动方向是反方向,这样就需要走到尽头在拐回来才能遇见终点
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n, m;
cin >> n >> m;
int a, b, c, d;
string s;
cin >> a >> b >> c >> d >> s;
int cnt = 0;
for(int i = 1; i <= 2 * n * m; i ++ )
{
if(a == c && b == d)
{
cout << cnt << endl;
return;
}
bool f = false;
if(s[1] == 'L' && b == 1)
{
s[1] = 'R';
f = true;
}
else if(s[1] == 'R' && b == m)
{
s[1] = 'L';
f = true;
}
if(s[0] == 'U' && a == 1)
{
f = true;
s[0] = 'D';
}
else if(s[0] == 'D' && a == n)
{
f = true;
s[0] = 'U';
}
if(f) cnt ++ ;
if(s[0] == 'U') a -- ;
else a ++ ;
if(s[1] == 'L') b -- ;
else b ++ ;
}
cout << -1 << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while(_t -- ){
solve();
}
return 0;
}
G
结论:假设已经有了序列$c_1,c_2,c_3...c_k$,那么这个序列的各个子序列和,一定可以表示出$[1, \sum_1^kC_i]$内的所有数字。所以将数组排序,维护一个前 i 项的和,遍历第 i 项时,前 i - 1 项的和一定要大于等于第 i 项
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
void solve(){
int n;
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> a[i];
sort(a, a + n);
if(a[0] != 1)
{
cout << "NO" << endl;
return;
}
long long sum = a[0];
for(int i = 1; i < n; i ++ )
{
if(sum < a[i])
{
cout << "NO" << endl;
return;
}
sum += a[i];
}
cout << "YES" << endl;
}
int main()
{
freopen("test.in", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int _t = 1;
cin >> _t;
while(_t -- ){
solve();
}
return 0;
}