A. Even But Not Even
仔细分析一下题意,可以发现只和奇数的个数有关:
然后分情况讨论:
1、奇数的个数是奇数
2、奇数的个数是偶数
3、奇数的个数为0
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #include <bitset> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 #define PI acos(-1) const double eps = 1e-9; const int maxn = 600; const LL mod = 1e9 + 7; using namespace std; int main() { int T; cin >> T; while (T--) { int n; cin >> n; string s; cin >> s; int eve = 0,odd = 0; for (int i = 0;i < n;i++) { if ((s[i]-'0') % 2 == 1) odd++; else eve++; } if (odd % 2 == 0 && odd > 0) { for (int i = 0;i < n;i++) { if ((s[i]-'0')%2 == 1) { cout << s[i]; odd--; } if (odd == 0) break; } cout << endl; } else if (odd % 2 == 1 && odd > 1) { for (int i = 0;i < n;i++) { if ((s[i]-'0')%2 == 1) { cout << s[i]; odd--; } if (odd == 1) break; } cout << endl; } else cout << -1 << endl; } return 0; }
B. Array Sharpening
根据题意,我们知道有三种模型:
1、 0,1,2,3,4 .... n 递增模型
2、n,n-1,n-2 .... 0 递减模型
3、0,1,2,3 ... k ,k-1,k-2, ... 先增后减模型
我们可以发现前两种模型可以转化为第三种模型,所以我们只要按第三种模型去匹配就可以了
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #include <bitset> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 #define PI acos(-1) const double eps = 1e-9; const int maxn = 3e5 + 10; const LL mod = 1e9 + 7; using namespace std; int a[maxn]; int main() { int T; cin >> T; while (T--) { int n; cin >> n; for (int i = 0;i < n;i++) { cin >> a[i]; } bool f = false; int i; for (i = 0;i < n;i++) { if (a[i] >= i) continue; else break; } if (a[i-1] >= n-(i-1)-1) ; else { cout << "No" << endl; continue; } for (int j = i;j < n;j++) { if (a[j] < n-j-1) { cout << "No" << endl; f = true; break; } } if (!f) cout << "Yes" << endl; } return 0; }
C. Mind Control
题意:
总共有n个人和n个数字
n个人拍成一队,n个数字也是有顺序的
你排在第m个位置
按照顺序的每个人可以拿走这个序列中的第一个数字或者最后一个数字
你可以在所有人操作开始前说服最多k个人
让他们固定拿这个序列的第一个或者是最后一个数字
问你在所有可能的情况中可以拿到的数字的最大值中的最小值(即,到你取得的时候,首尾两个数字你总是会取最大的那个,问这些数字中的最小值)
首先看到 n 的范围才是3500,我们可以想到采取暴力求解
最多可以说服 k 个人,那我们肯定就说服 k 个人(贪心)
假设这 k 个人中有 i 个人选择前面的,那么就有 k - i 个人选择后面的 这样就留下了一个新的序列
我的位置是在 m ,那么我前面还有 m-1-k 个人才会轮到自己选择
假设说这 m-1-k 个人中有 j 个人选择了前面的,那么则有 m-1-k-j 个人选择了后面的
这样选择完后就会漏出头和尾,我们直接选择头和尾最大的那个就好了
对于 i 和 j 如何选择?
暴力枚举就好了呀!
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #include <bitset> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 #define PI acos(-1) const double eps = 1e-9; const int maxn = 4000; const LL mod = 1e9 + 7; using namespace std; int a[maxn]; int main() { int T; cin >> T; while (T--) { int n,m,k; cin >> n >> m >> k; for (int i = 1;i <= n;i++) cin >> a[i]; k = min(k,m-1); int ans = 0; for (int i = 0;i <= k;i++) { int tmp = INF; for (int j = 0;j <= m-k-1;j++) tmp = min(tmp,max(a[i+j+1],a[n-(k-i)-(m-k-1-j)])); ans = max(ans,tmp); } cout << ans << endl; } return 0; }
D. Irreducible Anagrams
分类讨论:
1、长度为 1,肯定是 Yes
2、头和尾不一样,肯定也是 Yes 因为我们给它反一下就可以了
3、字符串中有三个或三个以上的不同的字符
#include <iostream> #include <algorithm> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <math.h> #include <cstdio> #include <iomanip> #include <time.h> #include <bitset> #define LL long long #define INF 0x3f3f3f3f #define ls nod<<1 #define rs (nod<<1)+1 #define PI acos(-1) const double eps = 1e-9; const int maxn = 2e5 + 10; const LL mod = 1e9 + 7; using namespace std; int vis[26][maxn]; int main() { string s; int q; cin >> s; cin >> q; int len = s.length(); for (int i = 0;i < len;i++) { vis[s[i]-'a'][i]++; if (i > 0) { for (int j = 0;j < 26;j++) vis[j][i] += vis[j][i-1]; } } while (q--) { int l,r; cin >> l >> r; l--,r--; if (l == r) { cout << "Yes" << endl; continue; } if (s[l] != s[r]) { cout << "Yes" << endl; continue; } int cnt = 0; for (int i = 0;i < 26;i++) { int R = 0,L = 0; R = vis[i][r]; if (l > 0) L = vis[i][l-1]; if (R-L > 0) cnt++; } if (cnt >= 3) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }