A - Full House 2
题意
给\(4\)个整数,问能否添加一个整数使得恰有\(3\)个整数\(a\)和\(2\)个整数\(b\)
思路
模拟
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;const int mxn = 1e6 + 5;void solve()
{int A, B, C, D;cin >> A >> B >> C >> D;map<int, int> m;m[A]++;m[B]++;m[C]++;m[D]++;int a = 0; int b = 0; for (const auto& i : m){if (i.second == 3) {a++;}else if (i.second == 2) {b++;}}if (a > 0 || b >= 2) {cout << "Yes" << endl;}else {cout << "No" << endl;}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}
B - Calculator
题意
基础字符"\(00, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\)"。给定字符串\(s\),求其最少由多少基础字符组成
思路
模拟
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;const int mxn = 1e6 + 5;void solve()
{string s;cin >> s;if (s.find('0') == -1){cout << s.size();return;}int cnt = 0, ans = s.size();for (int i = 0; i < s.size(); i++){if (s[i] == '0'){if (cnt){cnt = 0;ans--;}else{cnt++;}}else{cnt = 0;}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}
C - Operate 1
题意
在字符串\(s\)中进行不超过\(1\)次操作:插入、删除、替换一个字符,判断是否有可能使得\(s=t\)
思路
由于最多只能操作一次,所以\(s\)与\(t\)的长度最多相差\(1\)(增/删一次);长度相同,最多只能有一个字符不同(替换一次);长度不同,只能是长串中多出一个字符,其他有不一样就无解
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;const int mxn = 1e6 + 5;void solve()
{int k;string s, t;cin >> k >> s >> t;if (s == t){cout << "Yes" << endl;return;}int ss = s.size(), tt = t.size();if (abs((int)ss - (int)tt) > 1){cout << "No" << endl;return;}if (ss == tt){int cnt = 0;for (int i = 0; i < ss; i++){if (s[i] != t[i]){cnt++;if (cnt > 1){cout << "No" << endl;return;}}}cout << "Yes" << endl;return;}int cnt = 0;for (int i = 0, j = 0; i < s.size() && j < t.size(); i++, j++){if (s[i] == t[j]){continue;}cnt++;if (cnt > 1){cout << "No" << endl;return;}if (s.size() > t.size()){i++;}else{j++;}}cout << "Yes" << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int T = 1;//cin >> T;while (T--){solve();}return 0;
}
D - Diagonal Separation
题意
给定\(n×n\)的网格,起初有\(m\)格被染色(给出\(x,y\)和颜色)。现在要讲所有格子都染成黑色或白色,使得:对于每一行,存在一个\(i\)使得第\(i\)格及其左边全是黑色,其余是白色;对于每一列,存在一个\(j\)使得\(j\)及其上边全是黑色,其余是白色。问是否能满足要求。
思路
显然对于最开始被染成黑色的格子,在它的左上区域(\(x\le x_i\),\(y\le y_i\))都不能有白色。那只要记录最左以及最上的白色格子位置,看有没有黑格子在其右、下即可。由于先以\(x\)升序排序,故只需记录最靠上的白格即可
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;const int mxn = 2e5 + 5;struct node
{int x, y;char ch;bool operator < (const node& a){if (x == a.x){return y < a.y;}return x < a.x;}
};void solve()
{int n, m;cin >> n >> m;vector<node> v(m);for (int i = 0; i < m; i++){int x, y;char ch;cin >> x >> y >> ch;x--, y--;v[i].x = x, v[i].y = y, v[i].ch = ch;}sort(v.begin(), v.end());int min_y = 1e18;for (int i = 0; i < m; i++){int x = v[i].x;int y = v[i].y;char ch = v[i].ch;if (ch == 'W'){min_y = min(min_y, y);}else if (min_y <= y){cout << "No" << endl;return;}}cout << "Yes" << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int __ = 1;//cin >> __;while (__--){solve();}return 0;
}
E - Maximize XOR
题意
给定大小为\(n\)的非负数序列\(A\),从中选\(k\)个元素进行异或,求异或的最大值,即求:
思路
题目保证\(C_n^k\le 10^6\),对于较小的\(k\)可以直接枚举(\(dfs\));对于较大的\(k\)可以反过来,先求出所有元素的异或和,枚举不需要的元素
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;const int mxn = 2e5 + 5;
int n, k, ans = -1;
vector<int> a;void dfs(int p, int res, int m)
{if (!m){ans = max(ans, res);return;}if (p == n) // 没选够{return;}dfs(p + 1, res ^ a[p], m - 1);dfs(p + 1, res, m);
}void solve()
{int tot = 0;cin >> n >> k;a.resize(n);for (int i = 0; i < n; i++){cin >> a[i];tot ^= a[i];}if (k <= n - k){dfs(0, 0, k);}else{dfs(0, tot, n - k);}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int __ = 1;//cin >> __;while (__--){solve();}return 0;
}