C. String Equality
原题链接:Problem - 1451C - Codeforces
题目大意:
通过两种步骤把给的a string 变成 b string,问可不可以这样,不可输出NO,可以输出YES。
第一种操作是换任意两个相邻元素。第二种是把长度为k的连续相等字符往后变成其他字符。。
题目做法:
第一种随意换位使得位置变得不重要,因为怎么样都可以换都可。
第二个种换法告诉我们,首先只能朝后,其次只能朝后k的倍数的字母数量。
然后就显然了。。
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int mode=1e9+7;
void solve()
{
int n,k;
cin>>n>>k;
string s1,s2;
unordered_map<char,int> mp1,mp2;
cin>>s1>>s2;
for(auto it:s1) mp1[it]++;
for(auto it:s2) mp2[it]++;
for(char i='a';i<='z';i++)
{
if(mp1[i]==mp2[i]) continue;
if(mp1[i]<mp2[i])
{
cout<<"NO"<<'\n';
return ;
}
if(mp1[i]>mp2[i])
{
if((mp1[i]-mp2[i])%k==0)
{
mp1[i+1]+=mp1[i]-mp2[i];
}
else
{
cout<<"NO"<<'\n';
return ;
}
}
}
cout<<"YES"<<'\n';
}
signed main()
{
fast int casen=1;
cin>>casen;
while(casen--) solve();
}
D. Insert a Progression
题目大意:
给你一个n,一个x。然后输入长度为n的数组。把1,2,...... ,x插入数组中,形成一个新的数组,要你使得这个新数组的score最小。
题目做法:
给你一个n,一个x。然后输入长度为n的数组。
首先,插入并不会使得这个原来的值减小,其次,原数组最大值最小值区间内的值加入总能找到一个使得这个score不变的位置,再者就是解决其他的值,首先是插入的最大值,若其比原数组的最大值还大,的插入到使其增量最少的位置,最小值同理,你问你其他的吗,其他的,你插入的最大值和最小值都放好了,其他的也就能无代价放入了。
题目很简单,一开始差点看错题,以为插入的值也要输入,还好最后意思大差不大,以后还是得好好读题才行。。。
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define int long long
using namespace std;
const int mode = 1e9+7;
void solve(){
int n, nx;
cin >> n >> nx;
int ar[n], arx[nx], max1 = 0, max2 = 0, min1 = 0, min2 = 0, finalres = 0;
for(int i = 0; i < n; i++){
cin >> ar[i];
if(i == 0){
min1 = max1 = ar[i];
}
else{
finalres += abs(ar[i] - ar[i - 1]);
min1 = min(min1, ar[i]);
max1 = max(max1, ar[i]);
}
}
// for(int i = 0; i < nx; i++){
// cin >> arx[i];
// if(i == 0){
// min2 = max2 = arx[i];
// }
// else{
// min2 = min(min2, arx[i]);
// max2 = max(max2, arx[i]);
// }
// }
// cout << finalres << '\n';
min2 = 1, max2 = nx;
if(max2 > max1){
int add = 0;
for(int i = 0; i < n; i++){
if(i == 0){
add = abs(ar[i] - max2);
}
else{
add = min(add, abs(ar[i] - max2) + abs(ar[i - 1] - max2) - abs(ar[i] - ar[i - 1]));
}
}
add = min(add, abs(ar[n-1] - max2));
finalres += add;
}
if(min2 < min1){
int add = 0;
for(int i = 0; i < n; i++){
if(i == 0){
add = abs(ar[i] - min2);
}
else{
add = min(add, abs(ar[i] - min2) + abs(ar[i - 1] - min2) - abs(ar[i] - ar[i - 1]));
}
}
add = min(add, abs(ar[n-1] - min2));
finalres += add;
}
cout << finalres << '\n';
}
signed main(){
fast int casen = 1;
cin >> casen;
while(casen--) solve();
}