文章目录
A. Is It a Cat?
题目大意
有一个字符串,在不区分大小写和重复字母的情况下判断是否满足meow。
题目分析
此题可以通过标记的方法来判断,也可以通过C++函数快速解决问题
tolower
函数:可以将大写字母变为小写字母unique
函数:可以去掉重复字母,返回值为去重后最后一个字母的地址,但是不会改变字符串长度erase
函数:可以清楚对应区间内的字符
code
#include<bits/stdc++.h>
using namespace std;
int n, m, k, t;
void solve()
{
string s;
cin >> n >> s;
for(int i = 0; i < n; i ++) s[i] = tolower(s[i]);
s.erase(unique(s.begin(), s.end()), s.end()) ;
//cout << s << "--\n";
if(s == "meow") puts("YES");
else puts("NO");
}
int main()
{
cin >> t;
while(t --) solve();
return 0;
}
B. Count the Number of Pairs
题目大意
有一个由大小写字母组成的字符串,每一次操作可以将一个字母的大小写改变,问在操作次数不大于k次得情况下,大小写字母相皮匹配的最大对数是多少。
题目分析
可以先统计不同字符各出现了几次,然后再遍历每一对字母。假如有两个A
和4个a
,那么组成两对以后还剩下两个A
,将其中一个改成小写即可增加一对。
code
#include<bits/stdc++.h>
using namespace std;
int n, m, k, t;
void solve()
{
map<char, int>q;
string s;
cin >> n >> k >> s;
for(int i = 0; i < s.size(); i ++) q[s[i]] ++;
int ans = 0;
for(int i = 0; i < 26; i ++)
{
int r1 = q['a' + i], r2 = q['A' + i];
ans += min(r1, r2);
if(k)
{
int tem = max(r1, r2) - min(r1, r2);
tem /= 2;
if(tem <= k) ans += tem, k -= tem;
else ans += k, k = 0;
}
}
cout << ans << "\n";
}
int main()
{
cin >> t;
while(t --) solve();
return 0;
}
C. Powering the Hero
题目大意
一副牌有n张,每一张牌的特点是它的力量。有两种类型的卡片:一张英雄牌0;奖励卡,正整数。你可以对牌组做以下操作:从牌堆顶端取一张牌;如果这张卡是奖励卡,你可以把它放在你的奖励卡组顶部或丢弃;如果这张牌是英雄牌,那么你的奖励牌组中最上面那张牌的能量会被加到他的能量中(如果它不是空的),之后英雄会被加到你的军队中,使用的奖励会被丢弃。你的任务是使用这些行动聚集一支军队与最大可能的总力量。
题目分析
可以使用优先队列解决问题,将数字不断加入到队列,遇到零的时候就将队首的数值累加,并弹出队首。
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, t;
void solve()
{
priority_queue<int>q;
cin >> n;
int ans = 0;
while(n --)
{
int u; cin >> u;
if(u) q.push(u);
else if(!q.empty())
{
ans += q.top();
q.pop();
}
}
cout << ans << "\n";
}
signed main()
{
cin >> t;
while(t --) solve();
return 0;
}
D. Remove Two Letters
题目大意
有一个小写字母组成的字符串。从字符串s中删除两个连续字符,在这样的操作之后可以获得多少不同的字符串。
题目分析
我们可以遍历删除每两个相邻字符,若相邻两次操作去掉的字母是一样的则对答案没有贡献。所以只要判断相邻两次操作去点的字符是否一样即可。
不要忘记加上1,因为每次比较都是以前一个为基准的,所以要把第一个算上。
code
#include<bits/stdc++.h>
using namespace std;
int n, m, k, t;
void solve()
{
string s;
cin >> n >> s;
int ans = 0;
for(int i = 1; i < n - 1; i ++)
if(s[i - 1] != s[i + 1]) ans ++;
cout << ans + 1 << "\n";
}
int main()
{
cin >> t;
while(t --) solve();
return 0;
}