B题:Unhappy HackingProblem
给定一个字符串和一个空串,字符串只包含01B三种字符,从字符串首开始,若为0/1则在空串后添加0/1; 若为B且字符串不为空,则删除字符串最后一个字符,; 若为B且字符串为空则不做任何改变。
Solution
按照题意模拟即可,在这里可以直接使用STL的string,方便操作
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
string s; cin >> s;
string ans;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'B' && ans.size())
ans.pop_back();
else if(s[i]!='B')ans.push_back(s[i]);
}
cout << ans;
return 0;
}
C题:Be Together
给定N个数字,每一次可以对没有被操作过的数字进行操作,每次操作若将x变为y,将付出 的代价,问将序列每个数全部相等的最小代价
Solution
注意范围极小,且最后序列相等的数一定属于-100-100的区间内,直接从-100-100对每个数字进行枚举即可
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[110];
int ans = 1e9;
int minsum = 1e9;
int n;
void sv(int x)
{
int sum = 0;
for (int i = 1; i <= n; i++)
sum += (x - a[i]) * (x - a[i]);
if (sum < minsum)
{
minsum = sum;
ans = x;
}
return;
}
signed main()
{
ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = -100; i <= 100; i++)
sv(i);
cout << minsum;
return 0;
}
D题:Unbalanced
给定一个只包含小写字母的字符串S,对于S中的大小≥2的连续字串,若字串内存在一个字母出现次数>字串大小的一半时,则输出这个字串的左端点和右端点,若S中不存在这样的字串,输出
-1 -1
Solution
长度最大为1e5,对每个位置暴力肯定是不行的,考虑先对长度进行分类讨论:
当长度为2时,字串字母必须全部相等
当长度为3时,必须至少存在2个字符相等
考虑当长度为4时,必须至少出现3个字母相等,则长度为4时的条件等价与长度为3时的条件
长度为5时,也必然存在一个长度为3的区间至少出现2个相同的字母...................
所以我们只需要对每个位置和其后面两个位置进行判断即可,若存在两个字母相等,则存在这样的字串,同时注意特判长度为2时的情况
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
string s; cin >> s;
if (s.size() == 2)
{
if (s[0] == s[1])
cout << 1 << " " << 2;
else cout << -1 << " " << -1;
return 0;
}
for (int i = 0; i < s.size()-2; i++)
{
if (s[i] == s[i + 1])
{
cout << i+1 << " " << i + 2;
return 0;
}
if (s[i] == s[i + 2])
{
cout << i +1<< " " << i + 3;
return 0;
}
if (s[i + 1] == s[i + 2])
{
cout << i + 2 << " " << i + 3;
return 0;
}
}
cout << -1 << " " << -1;
return 0;
}