传送门
A Yura's New Name
签到题,怪我没有皇后看样例子,意思就是把有^和_组成的字符串加若干个字符使得全部都是笑脸(^^或^_^),所一我们遍历一下字符串,把连着都是两个的地方加上^即可,最后处理一下开头和结尾就行
#include<bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;
const int N = 300010;
int a[N];
int n;
void solve() {
string s;
cin >> s;
int ans = 0;
if (s.size() == 1 && s[0] == '^') {
cout << 1 << endl;
return;
}
for (int i = 0; i < s.size() - 1; i++) {
if (s[i] == '_' && s[i + 1] == '_')ans++;
}
if (s[0] == '_')ans++;
if (s[s.size() - 1] == '_')ans++;
cout << ans << endl;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int h_h;
cin >> h_h;
while (h_h--)solve();
return 0;
}
B JoJo's Incredible Adventures
比赛时已经想出来了,但是有些细节没有考虑到,没过可惜,题目的意思就是找出字符串种连续1 的个数最长,并且还要考虑首尾都有1是可以连在一起的,最后在1和n+1,2和n,3和n-1.....求出当中的最大值就是答案。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 110;
void solve() {
string s;
cin >> s;
int mx = INT_MIN;
int cnt = 0;
if (s[0] == '1' && s[s.size() - 1] == '1') {
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0')break;
cnt++;
}
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] == '0')break;
cnt++;
}
}
if (cnt == s.size() * 2) {
cout << cnt * cnt / 4 << endl;
return;
}
//cout << cnt << endl;
mx = max(cnt, mx);
cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') {
mx = max(cnt, mx);
cnt = 0;
} else cnt++;
}
mx = max(cnt, mx);
//cout << mx << endl;
int ans = 0;
for (int i = 1; i <= (mx + 1) / 2; i++) {
ans = max(ans, i * (mx - i + 1));
}
cout << ans << endl;
}
int32_t main() {
int h_h;
cin >> h_h;
while (h_h--)solve();
return 0;
}
C Constructive Problem
这题涉及到一个mex(),就是求一个集合中没有出现的最小值,题目想让先求出原始集合的mex值,改变一段区间内的所有数,复制为原始集合的mex值,问能不能让改变了的集合的mex值增加1,可以先找楚mex值,并且确定集合中所有的等于mex+1的值的区间,并且全部复制为mex,在check就一遍,但要注意,有可能找不到等于mex+1的值,那么就说明这个值就是区间里的最大的值,无法满足条件,还有可能是mex和mex+1都没有,就可以把大于mex+1的元素改为mex就可以了。
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N];
int n, m, k;
int Mex(int a[]) {
map<int,int> mp;
int mx = 0;
for (int i = 0; i < n; i++)mp[a[i]]++, mx = max(mx, a[i]);
for (int i = 0; i <= mx + 1; i++) {
if (mp[i] == 0)return i;
}
}
void solve() {
cin >> n;
for (int i = 0; i < n; i++)cin >> a[i];
//cout << Mex(a) << endl;
int mex = Mex(a);
int l = 1e9, r = 0;
for (int i = 0; i < n; i++) {
if (a[i] == mex + 1) {
l = min(l, i);
r = max(r, i);
}
}
if (l == 1e9) {
if (mex == n)puts("No");
else puts("Yes");
return;
}
for (int i = l; i <= r; i++)a[i] = mex;
int mex1 = Mex(a);
if (mex1 == mex + 1)puts("Yes");
else puts("No");
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
int h_h;
cin >> h_h;
while (h_h--)solve();
return 0;
}