Codeforces 1011 (Div. 2)A. Serval and String Theory
目录
题意简述:
思路明确:
总代码:
https://codeforces.com/contest/2085/problem/A
题意简述:
题目给定一个字符串,并给定一个操作,以及可以执行操作的限定次数,该操作是任选两个下标,交换对应的字符,最后判断能否在操作限次次数下保证该字符串小于其翻转字符串(reverse),可以输出YES else输出NO;
思路明确:
首先我们要明确一件事,就是所选下标可以相同,也就是说不强制交换两个不同的数,在换句话说就是给定的操作次数可以不用;
知道了这一点那这个题就很easy了,先判断该字符串内的字符是不是都是相同字符,如果是那直接输出NO就行,因为无论怎么改也不会使其符合条件;再判断该字符串本身是不是不用修改就已经小于其翻转字符串了?如果本身小于直接YES;最后在根据k的值,只要k>=1那么直接输出YES否则输出NO即可(可以这么理解:不对原数组进行操作,先把原数组翻转,对翻转数组进行修改操作,目前是原数组大于翻转数组,但只要对翻转数组进行一次修改就能使得原数组小于翻转数组)
总代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, k;
string s;
cin >> n >> k >> s;
map<char,int>cc;
for(auto x:s)
{
cc[x]++;
}
if(cc.size()==1)
{
cout << "NO" << endl;
}else{
string rev_s = s;
reverse(rev_s.begin(), rev_s.end());
//翻转函数,两个参数是指针
if (s < rev_s) {
cout << "YES\n";
} else {
cout << (k >= 1 ? "YES\n" : "NO\n");
}
}
}
return 0;
}