Codeforces Round #609 (Div. 2)

A

简单题,输出 8n 和9n即可
因为8n是8的倍数,9n是9的倍数
而9n-8n=n成立

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int n;
    cin >> n;
    printf("%d %d\n",9 * n, 8 * n);
    return 0;
}

B

给出两个n长的序列和一个m
\((a_{i}+x) %m = b_{p}\)

这题我失误了,竟然在for i里面加了个for i,太傻了
还有就是我的操作是用b的每个值比较a[0]进行求解,然后我特么又傻了,竟然写成了a[i]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#define ll long long
using namespace std;
const int maxn = 2e3+5;
const int inf = 1e9 + 66555;
int a[maxn];
int b[maxn];
int c[maxn];
int n,m;
bool check(int *a,int *b){//O(nlogn)
    sort(a,a+n);
    for(int i = 0; i < n; i++){
        if(a[i] != b[i]){
            return 0;
        }
    }
    return 1;
}
int main(){
    cin >> n >> m;
    for(int i = 0; i < n; i++)scanf("%d",&a[i]);
    for(int i = 0; i < n; i++)scanf("%d",&b[i]);
    int ans = inf;
    sort(b,b+n);
    for(int i = 0; i < n; i++){
        int t;
        if(b[i] > a[0])t = b[i] - a[0];
        else t = m + b[i] - a[0];
        for(int j = 0; j < n; j++){
            c[j] = (a[j] + t) % m;
        }
        if(check(c,b)){
            ans = min(ans,t);
        }
    }
    cout << ans % m << endl;
    return 0;
}

C

这题就是只需要变前k个就行了
如果有前k个组成的n/k个k数的数组小于之前的,那么把最后一个数也就是a[k]加一
然后考虑进位的问题(我被hack在这里)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define ll long long
using namespace std;
const int maxn = 2e5 + 5;
const int inf = 0x3f3f3f3f;
char a[maxn];
char z[maxn];
int n,k;
void change(){
    if(z[k] == '9'){
        z[k - 1]++;
        z[k] = '0';
        int i = k - 1;
        while(z[i]==':'){
            z[i - 1]++;
            z[i] = '0';
            i--;
        }
    }else{
        z[k]++;
    }
    int cnt = 1;
    for(int i = 1; i <= n; i++){
        if(cnt == k + 1)cnt = 1;
        z[i] = z[cnt++];
    }
}
int main(){
    cin >> n >> k;
    scanf("%s",a + 1);
    int cnt = 1;
    for(int i = 1; i <= n; i++){
        if(cnt == k + 1)cnt = 1;
        z[i] = a[cnt++];
    }
    int zz = strcmp(z + 1, a + 1);
    if(zz < 0){
        change();
    }
    printf("%d\n",n);
    printf("%s\n",z + 1);
    return 0;
}

原文地址:https://www.cnblogs.com/Emcikem/p/12079115.html

时间: 2024-08-30 17:11:02

Codeforces Round #609 (Div. 2)的相关文章

Codeforces Round #609 (Div. 2) A-E简要题解

contest链接:https://codeforces.com/contest/1269 A. Equation 题意:输入一个整数,找到一个a,一个b,使得a-b=n,切a,b都是合数 思路:合数非常多,从1开始枚举b,a就是b+n,每次check一下a,b是否是合数,是的话直接输出,break即可 AC代码: 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<cstri

Codeforces Round #609 (Div. 2) 【A,B,C】

题意:给一个n<=1e7,找两个合数a和b使得a-b的差为n. 构造a=3n,b=2n,必含有公因子n,只有当n是1的时候是特例. 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define inf 0x3f3f3f3f3f3f 6 #define N 300009 7 int arr[]={2,3,5,7,13}; 8 signed main(){ 9 int n;scanf(

Codeforces Round #609 (Div. 2) 题解

Equation Modulo Equality Long Beautiful Integer Domino for Young K Integers Equation \[ Time Limit: 3 s\quad Memory Limit: 256 MB \] 这题做法很多,甚至可以直接暴力判断 view #include <map> #include <set> #include <list> #include <ctime> #include <

Codeforces Round #609 (Div. 2)E--K Integers(贪心+二分+树状数组+逆序对)

K Integers 参考博客:https://blog.csdn.net/Q755100802/article/details/103664555 [题意] 给定一个1到n的排列,可以交换相邻的两个元素. 现在定义一个函数f(x),表示在原排列中,通过交换操作,形成一个1,2,3....x的排列的子串,需要的最小操作步骤. 子串意味着这个排列必须是相邻的.现在你需要求出f(1),f(2),f(3)......f(n). [分析] 在1~x这几个元素相邻的情况下,因为最后排列不存在逆序对,根据贪

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除