A - Range Swap
题目的意思是给你一个序列,再给出两段区间(两段区间保证一样长),按顺序交换这两段区间中的数字
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000010;
int n;
int a, b, c, d;
int f[N];
int main()
{
cin >> n >> a >> b >> c >> d;
for(int i = 1; i <= n; i ++)
{
cin >> f[i];
}
for(int i = a, j = c; i <= b, j <= d; i ++, j ++)
{
swap(f[i], f[j]);
}
for(int i = 1; i <= n; i ++)
{
cout << f[i] << " ";
}
return 0;
}
B - Cat
将字符串的“na”替换成“nya,直接加上去就好了。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
string str;
int main()
{
cin >> n >> str;
//naan
for (int i = 0; i < n; i ++)
{
if (str[i] == 'n' && str[i+1] == 'a') //判断相邻的两个字符是否是 “na”
{
cout << "nya";
i ++;
}
else cout << str[i];
}
return 0;
}
C - Rotate and Palindrome
题意:给定一个字符串,经过n次A操作和m次B操作(n,m可以为0)将字符串变成一个回文串,A操作或B操作都有一定的代价,问将字符串变成回文串需要花费的最小代价是多少
A:将第一个字符移动到字符串末尾
B:选择任意一个字符更改成自己想要的字符
数据量是5000,用平方级别的算法可以暴力枚举,可以首先把字符串置成两倍长,这样子相当于进行了n次A操作,可以更好的进行关于B的后续操作。开始遍历n次字符串,这里i相当于进行了i次A操作,之后计算需要再进行几次B操作。我们不需要考虑A操作和B操作交替进行,B操作是可以在所有的A操作完成后再进行的,并且不会对最终结果造成影响。最后再用min()函数算出最小值即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
LL a, b;
string s;
int main()
{
cin >> n >> a >> b >> s;
s += s;
LL ans = 1e13;
for (int i = 0; i < n; i ++)
{
LL tmp = a * i;
for (int j = 0; j < n / 2; j ++)
{
int l = i + j;
int r = i + n - 1 - j;
if(s[l] != s[r]) tmp += b;
}
ans = min(ans, tmp);
}
cout << ans << endl;
}