2024/3/25

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

原题链接:Problem - D - Codeforces

题目大意:

给你一个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();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值