码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #629 (Div. 3)

时间:2020-03-27 11:16:20      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:mat   lowbit   两个指针   out   mem   with   说明   syn   sizeof   

A Divisibility Problem

题意

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

思路

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

#include <bits/stdc++.h>
using namespace std;
#define endl ‘\n‘ 
#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 ‘\n‘ 
#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 ‘\n‘ 
#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)

标签:mat   lowbit   两个指针   out   mem   with   说明   syn   sizeof   

原文地址:https://www.cnblogs.com/lukelmouse/p/12579396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!