Codeforces Round 786 (Div. 3)

文章提供了CodeforcesRound786编程竞赛中四道题目的详细思路和C++代码实现,包括NumberTransformation、Dictionary、InfiniteReplacement和A-B-CSort。对于每道题,作者给出了如何判断条件和解决问题的方法,并展示了具体的代码片段。
摘要由CSDN通过智能技术生成

A - Number Transformation

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意

给定两个数x与y,问是否存在a,b使得x与a个b相乘等于y

思路

因为存在多组解,只需其中一组解即可,所以可以使a为1,若y能被x整除,则b=y/x,若不能,则输出0 0

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int t;
    cin >> t;
    while (t--) {
        ll x, y;
        cin >> x >> y;
        ll a = 0, b = 0;
        if (y % x == 0) {
            a = 1;
            b = y / x;
        }
        cout << a << " " << b << endl;
    }
    return 0;
}

B - Dictionary

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意

《伯兰词典》中的单词按照字典中通常的顺序排序的。形式上,如果下列条件之一成立,则单词A在字典中出现的时间早于单词B:
1.A的第一个字母小于B的第一个字母
2.A和B的第一个字母相同,A的第二个字母小于B的第二个字母
给定一个单词S,在字典中找到它的位置
注意字典中不存在两个字母都相同的单词

思路

因为数据量不大,可以直接暴力求解
双层循环计数,若与S相同,则跳出循环

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;cin>>t;
    while(t--){
        string s;cin>>s;
        int ans=0, flag=0;
        for(char i='a';i<='z';i++)
        {
            for(char j='a';j<='z';j++)
            {
                if(i==j) continue;//两个字母相等
                ans++;
               if(i==s[0]&&j==s[1])
               {
                   cout<<ans<<endl;
                   flag=1;
                   break;
               }
            }
            if(flag==1) break;
        }
    }
    return 0;
}

C - Infinite Replacement

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意

初始给定一个全由a组成的字符串s,再给定一个字符串t,t可替换s中任意a的位置,可替换数次,当s中不存在a时,则无法进行替换,问替换后会有多少个不同的字符串。
注意:也可以不进行替换

思路

分为两种情况:
1.若t中存在a并且t的长度不为1,则可以一直进行替换,有无穷个字符串,若t中存在a并且t的长度为1,则无论如何替换,s依旧是原来的字符,所以只有一种情况
2.若t中不存在a,则可以获取字符串s的长度l,情况为2的l次方。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;cin>>t;
    while(t--)
    {
        string s;cin>>s;
        string s2;cin>>s2;
        int flag=0;
        for(int i=0;i<s2.size();i++)
        {
            if(s2[i]=='a') {
                flag=1;
                break;
            }
        }
        if(flag==1) {
            if(s2.size()==1) cout<<1<<endl;
            else cout << -1 << endl;
        }
        else {
            ll l=s.size();
            ll count=1;
            count=pow(2,l);
            cout<<count<<endl;
        }
    }
}

D - A-B-C Sort

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意

有三个数组a,b和c,最初a总有n个元素,数组b和c为空,可执行以下算法:
1.a不为空,取a中最后一个元素移动到数组b的中间位置,若b中元素为奇数,则可以将此元素放在中间元素的左侧或者右侧,直到a变成空并且b中有n个元素
2.b不为空,从b取出中间元素放在c的末尾,如果b的长度为偶数,则可以任意选择两个中间元素中的随意一个,直到b变成空并且c中有n个元素
是否可以使c中做到是增序排序

思路

找规律会发现,如果n为奇数,则可以直接将a中的第一个元素放入c中,然后将a中剩余元素两个一起比大小,小的先放入c中,再将大的放入c中,然后再判断c是否为增序排序
如果n为偶数,就直接将a中第一个元素开始每两个元素一起比大小放入c中
数组b只是一个媒介,数组a的最后一个元素放入b中间,然后再取b的中间元素放入c中,其实到最后会发现a的开始元素会在b的中间,所以c的第一个元素会与a的第一个元素挂钩

代码

#include<bits/stdc++.h>
using namespace std;
int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        int a[n], c[n], k = 0;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        int flag = 0;
        if (n % 2 == 1) {
            c[k] = a[0];
            flag = 1;
            k++;
        }
        int i = 0;
        if (flag == 1) i = 1;
        for (; i < n; i += 2) {
            if (a[i] > a[i + 1])
                swap(a[i], a[i + 1]);
            c[k] = a[i];
            k++;
            c[k] = a[i + 1];
            k++;
        }
        int f = 0;
        for (i = 1; i < n; i++) {
            if (a[i] < a[i - 1])
                f = 1;
        }
        if (f == 0) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值