Codeforces Round #629 (Div. 3)

Posted lukelmouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #629 (Div. 3)相关的知识,希望对你有一定的参考价值。

A Divisibility Problem

题意

给你两个正整数(a,b) 你每次可以执行一次(a++)操作,问你最小的操作步数,使得(a)能被(b)整除

思路

数学
分情况讨论
(a<b) 时,显然只有(a == b)时才能保证(a)(b)整除
(a>b) 时,只要把(a)调整到离(kb)最近的一个(b)的倍数,即(lceil {a / b} ceil * b - a)

#include <bits/stdc++.h>
using namespace std;
#define endl ‘
‘ 
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int main() {
    IO;
    int t,a,b;
    cin >> t;
    while(t --) {
        int cnt = 0;
        cin >> a >> b;
        if(a < b) cnt += (b - a);
        else cnt += ((a + b - 1)/ b) * b - a;
        cout << cnt << endl;
    }
    return 0;
}

B K-th Beautiful String

题意

给定一个(n>2)(k),初始化字符串的前(n-2)个字符为(a),最后两个字符为(b),此为字符串的第一个排列,所有字符串的按字典序排列,让你求第(k)个字符串

思路

二进制,双指针,贪心
(a)看成(0)(b)看成(1),整个字符串的排列就是一个二进制加法
每次,排列的名次(+1),整个字符串就加上它的(lowbit()),为了保证整个字符串只有两个(b)
如果lowbit发生了进位,就要在末尾再加上一个(1)
具体做法不能直接按二进制加法来,因为题目的数据范围是(1e5),(int,long long)等数据类型都达不到这么长的数据位,所以考虑维护两个指针(i,j) 分别表示第一个(b)的位置和第二个(b)的位置
如果(i+1==j)说明(i,j)相邻,那么他们相加必然导致进位,所以(i++,j=n)
如果(i,j)不相邻,每次只需要处理(j)的进位即可,(j++)
循环(k)次,(i,j)的位置即是两个(b)的位

#include <bits/stdc++.h>
using namespace std;
#define endl ‘
‘ 
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int main() {
    IO;
    int t,n,k;
    cin >> t;
    while(t --) {
        cin >> n >> k;
        int i = n - 1,j = n;// b is here;
        k --;
        while(k --) {
            if(i + 1 == j) {
                i --;
                j = n;
            }
            else {
                j --;
            }
        }
        for(int k = 1;k <= n; ++k) {
            if(k == i || k == j) cout << ‘b‘;
            else cout << ‘a‘;
        }
        cout << endl;
    }
    return 0;
}

C Ternary XOR

题意

给定一个三进制的数(c),定义运算符(⊙) 表示(c_i=(a_i+b_i)mod3)
让你求另外两个三进制数(a,b),使得(c=a⊙b),且(max(a,b))最小

思路

贪心
因为它的运算不涉及进位,只对当前位有影响,所以只考虑当前位即可
对于(c_i)的每一位,先尽量保持均分到(a_i,b_i)
如果某一位在过程中发生了(0,1)分配,那么接下来的所有数字都分配到(0)那一位后面即可
这样就能使得(a,b)尽可能相近了。

#include <bits/stdc++.h>
using namespace std;
#define endl ‘
‘ 
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 5e4 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int a[N],c[N],b[N];
int main() {
    IO;
    int t,n;
    char x;
    cin >> t;
    while(t --) {
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
        cin >> n;
        for(int i = 0;i < n; ++i) {
            cin >> x;
            a[i] = x - ‘0‘;
        }
        b[0] = c[0] = 1;
        int f = 0;
        for(int i = 1;i < n; ++i) {
            if(a[i] == 1 && !f) {
                if(b[i - 1] && !c[i - 1]) c[i] = 1;
                else if(!b[i - 1] && c[i - 1]) b[i] = 1;
                else b[i] = 1,f = 1;
            }
            else if(a[i] == 2 && !f) {
                if(b[i - 1] && !c[i - 1]) c[i] = 2;
                else if(!b[i - 1] && c[i - 1]) b[i] = 2;
                else {
                    b[i] = 1;
                    c[i] = 1;
                }
            }
            else if(f) {
                for(int j = i;j < n; ++j) {
                    c[j] = a[j];
                }
                break;
            }
        }
        for(int i = 0;i < n; ++i) cout << b[i];
        cout << endl;
        for(int i = 0;i < n; ++i) cout << c[i];
        cout << endl;
    }
    return 0;
}

以上是关于Codeforces Round #629 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章

Make k Equal from Codeforces Round #629 (Div. 3)

Codeforces Round #629 (Div. 3) E. Tree Queries(lca题)

Codeforces Round #629 (Div. 3)

Codeforces Round #629 (Div. 3) 解题报告

D. Carousel.(简单做法)Codeforces.Round #629 (Div. 3)

Codeforces Round #629 (Div. 3) F - Make k Equal (离散化 树状数组维护前缀和)