Codeforces Round 863 (Div. 3) (A~E)

本文介绍了五个编程问题的解决方案,包括在字符串中插入数字以保持数位相等、计算点在传送带上达到最外层的最短距离、根据给定信息恢复数组、判断矩形是否能分割成不同大小的正方形以及将十进制数转换为特殊九进制表示并处理特定数值。
摘要由CSDN通过智能技术生成

A. Insert Digit

分析

插入一位数使之尽可能的大,那么插入后所有可能的数的数位相等,就只需要考虑高位的数尽可能大,将插入的数与要插入的数的每位数相比较,大于就在这个数位前插入,如果到最后都没有插入,就将d插入到最后。

代码实现

#include<bits/stdc++.h>

using namespace std;

const int N = 100010,mod = 1e6+7;
typedef long long ll;
typedef pair<int,int> pii;

int n,m,k;

void solve()
{
    cin >> n >> m;
    string s;
    cin >> s;
    int f = 0;
    for(int i = 0;i < n; i++)
    {
        if(s[i] - '0' < m && !f)
        {
            f = 1;
            cout << m << s[i];
        }
        else cout << s[i];
    }
    if(!f) cout << m;
    cout << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    T = 1;
    cin >> T;
    while(T--) solve();
    return 0;
}

B. Conveyor Belts

分析

假设每个点移动到最外层四条边距离最小值为最短距离,因为一个点(x,y)可以在指定的正方形中循环移动,即最短距离min{x,n-x+1,y,n-y+1},两个点的最少操作即两个点的最短距离之差。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

void solve()
{
    int x1, y1, x2, y2;
    cin >> n >> x1 >> y1 >> x2 >> y2;
    int a, b;
    a = min({x1, n - x1 + 1, y1, n - y1 + 1});
    b = min({x2, n - x2 + 1, y2, n - y2 + 1});
    cout << abs(a - b) << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

C. Restore the Array

分析

构造题,由题意可知b_i=max(a_i,a_{i+1}),假设a_n = b_{n-1},由后往前推,因为a_i影响b_ib_{i-1}的值,如果b_{i-1}b_i小同时a_{i+1}等于b_i,那么将用b_{i-1}a_i复制,保证a_i的值不影响 ​b_{i-1},确保b_i的值由 a_{i+1},其余情况用 b_i复制给a_i,因为a_{i+1}不等于b_i确保b_i有 a_i获得。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 1e9+7;
int n,m;
int a[N],b[N];

void solve()
{
    cin >> n;
    for(int i = 1;i <= n; i++) a[i] = 0;
    for(int i = 1;i <= n - 1; i++) cin >> b[i];
    a[1] = b[1], a[n] = b[n - 1];
    for(int i = n - 1;i > 1; i--)
    {
        if(b[i - 1] < b[i] && max(a[i],a[i + 1]) == b[i]) 
        {
            a[i] = b[i - 1];
        }
        else a[i] = b[i];
    }
    for(int i = 1;i <= n; i++)
        cout << a[i] << ' ';
    cout << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

D. Umka and a Long Flight

想了好久都没怎么搞明白,只能将自己的想法先记录下来,还是思维太弱了。

分析

有题目和猜测判断一个矩形能否被分割成2个边长为1的正方形、边长为2,3...n的正方形各一个,同时官方的证明:F[0]^2+F[1]^2+...+F[n]^2=F[n]*F[n+1],F[n]*F[n+1]=F[n]*(F[n-1]*F[n])。依次将边长从大到小的正方形方块割出去,如果F[n-1] < y <= F[n]就无法割出当前为F[n]的正方形。当y>F[n],将左边的正方形割去,涂色方格的坐标变为(y-F[n], x).同理可得,y<=F[n-1]时,将右边的正方形割去,涂色方格的坐标变为(y,x),知道割到只剩下最后一个边长为1的正方形。大家可以画一画,下面给出y>F[n]的情况。

 代码实现

#include<bits/stdc++.h>

using namespace std;

const int N = 100010,mod = 1e6+7;
typedef long long ll;
typedef pair<int,int> pii;

int n,m,k;
int F[50];

bool check(int n, int x, int y)
{
    if(n == 0) return true;
    if(y <= F[n-1]) 
    {

    }
    else if(y > F[n])
    {
        y -= F[n];
    }
    else return false;
    return check(n-1, y, x);
}

void solve()
{
    int n,x,y;
    cin >> n >> x >> y;
    cout << (check(n, x, y) ? "YES" : "NO") << '\n';
}

void init()
{
    F[0] = 1,F[1] = 1;
    for(int i = 2;i < 50; i++)
    {
        F[i] = F[i-1]+F[i-2];
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    T = 1;
    init();
    cin >> T;
    while(T--) solve();
    return 0;
}

E. Living Sequence

分析

看了题解很妙的思路,将{0,1,2,3,5,6,7,8,9}当作一个字符集的九进制数,给予我们的是一个不出现4的十进制数,将k转换为9进制,大于等于4的数将之转换时加1。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

void solve()
{
    ll k;
    cin >> k;
    vector<int> a;
    while(k)
    {
        a.push_back(k % 9);
        k /= 9;
    }
    reverse(a.begin(),a.end());
    for(int i = 0;i < a.size(); i++)
    {
        if(a[i] < 4) cout << a[i];
        else cout << a[i]+1;
    }
    cout << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值