zoukankan      html  css  js  c++  java
  • 【codeforces】 Codeforces Round #640 (Div. 4)

    套题传送门

    A. Sum of Round Numbers

    B. Same Parity Summands

    C. K-th Not Divisible by n

    D. Alice, Bob and Candies

    E. Special Elements

    F. Binary String Reconstruction

    G. Special Permutation

    AC代码


    A. Sum of Round Numbers

    【模拟】拆一个数,把该数的按数位分离出来,使分离出来的数相加仍为原数。

    B. Same Parity Summands

    【构造】(n)能否分解成(k)个正整数奇数或者偶数的和。

    五种情况:

    1. (k > n):NO;
    2. (n)为奇数,(k)为奇数:YES,只需要前(k-1)个数均为1,第(k)个数减去(k-1)即可;
    3. (n)为奇数,(k)为偶数:NO,偶数个奇数或偶数相加必为偶数;
    4. (n)为偶数,(k)为奇数:(偶数个奇数之和必为偶数),因此只能用偶数相加。如果(2*k>num),NO,否则前(k-1)个数取2,最后一个数减去(2*(k-1))即可;
    5. (n)为偶数,(k)为偶数:YES,只需要前(k-1)个数均为1,第(k)个数减去(k-1)即可;

    (1)与从(2)开始取起是为了方便构造。

    C. K-th Not Divisible by n

    【数学】这题我是找规律找出来的(dots)

    可以参考这位的题解 https://www.cnblogs.com/pjxpjx/p/12862956.html

    大家都是O(1)(dots)

    D. Alice, Bob and Candies

    【模拟】A从左边开始取,B从右边开始取,当前取的要比上一位取的要取到刚好多就停下来,取过的糖果不能再取(终止条件)。

    E. Special Elements

    【遍历】(8000^2)差不多有6e7,竟然过了...

    找数组里[l,r]区间的和在数组里有多少个。装桶后遍历。

    F. Binary String Reconstruction

    【构造】写得有点复杂...

    当00与11都有的时候,肯定有01:

    1. 如果00、01、11都有,则先写00,再写11(此时会形成一组01),最后再写01;
    2. 如果没有01,则只会仅有00或者11。

    G. Special Permutation

    【构造】构造出一个数组,相邻的数相差在[2,4]这个范围。

    (n<=4)

    1. (n<=3),-1;
    2. $ n = 4$,{3 1 4 2} 样例现有的;

    (n>4)

    1. (n)为奇数,先从小到大输出所有奇数,然后再输出第二大的偶数与第一大的偶数,最后按照从第三大的偶数从大到小输出。
    2. (n)为偶数,先从小到大输出所有偶数,然后再输出第二大的奇数与第一大的奇数,最后按照从第三大的奇数从大到小输出。

    AC代码

    A

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int t;
    int n;
    int num[1003];
    
    int main()
    {
        scanf("%d", &t);
        while(t--){
            scanf("%d", &n);
            int ans = 0;
            if(n / 1000 >= 1){
                num[ans++] = n - n % 1000;
            }
            n %= 1000;
            if(n / 100 >= 1){
                num[ans++] = n - n % 100;
            }
            n %= 100;
            if(n / 10 >= 1){
                num[ans++] = n - n % 10;
            }
            n %= 10;
            if(n >= 1){
                num[ans++] = n;
            }
            printf("%d
    ", ans);
            for(int i = 0; i < ans; i++){
                if(i != 0) printf(" ");
                printf("%d", num[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    

    B

    //
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int T;
    int num, k;
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%d %d", &num, &k);
            if(num < k) printf("NO
    ");
            else if(num % 2 == 1){
                if(k % 2 == 1){
                    printf("YES
    ");
                    for(int i = 1; i <= k - 1; i++){
                        printf("1 ");
                    }
                    printf("%d
    ", num - (k - 1));
                }
                else printf("NO
    ");
            }
            else if(num % 2 == 0){
                if(k % 2 == 1){
                    if(2 * k > num) printf("NO
    ");
                    else {
                        printf("YES
    ");
                        for(int i = 1; i <= k - 1; i++){
                            printf("2 ");
                        }
                        printf("%d
    ", num - 2 * (k - 1));
                    }
                }
                else {
                    printf("YES
    ");
                    for(int i = 1; i <= k - 1; i++){
                        printf("1 ");
                    }
                    printf("%d
    ", num - (k - 1));
                }
            }
        }
        return 0;
    }
    
    

    C

    //
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    typedef long long LL;
    int T;
    LL n, k;
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%I64d %I64d", &n, &k);
            LL ans = k;
            LL div = k / n;
            while(true){
                ans += div;
                if(ans / n == div){
                    printf("%I64d
    ", ans);
                    break;
                }
                else {
                    div = ans / n;
                    ans = k;
                }
            }
        }
        for(int i = 1; i <= 113; i++){
            printf("%d	", i);
            if(i % 7 == 0) printf("
    ");
        }
        return 0;
    }
    
    

    D

    //
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int T, n;
    int num[1003];
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%d", &n);
            for(int i = 1; i <= n; i++){
                scanf("%d", &num[i]);
            }
    
            bool flag = true; // 1:Alice  0:Bob
            int pa = 0, pb = 0, sa = 1, sb = n;
            int ta = 0, tb = 0;
            int ans = 0;
            while(true){
                if(sb < sa) break;
                ans++;
                if(flag){
                    pa = 0;
                    while(pa <= pb && sb >= sa){
                        pa += num[sa++];
                    }
    //                printf("ans:%d pa:%d pb:%d sa:%d sb:%d
    ", ans, pa, pb, sa, sb);
                    ta += pa;
                    if(pa > pb){
                        flag = false;
                    }
                    else break;
                }
                else {
                    pb = 0;
                    while(pb <= pa && sb >= sa){
                        pb += num[sb--];
                    }
    //                printf("ans:%d pb:%d pa:%d sb:%d sa:%d
    ", ans, pb, pa, sb, sa);
                    tb += pb;
                    if(pb > pa){
                        flag = true;
                    }
                    else break;
                }
            }
            printf("%d %d %d
    ", ans, ta, tb);
        }
        return 0;
    }
    
    

    E

    //
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int T, n;
    int num[8003];
    int take[8003];
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%d", &n);
            memset(take, 0, sizeof(take));
            for(int i = 0; i < n; i++){
                scanf("%d", &num[i]);
                take[num[i]]++;
            }
    
            int ans = 0;
            for(int i = 0; i < n - 1; i++){
                int tmp = num[i];
                for(int j = i + 1; j < n; j++){
                    tmp += num[j];
    //                printf("->i:%d j:%d ans:%d tmp:%d
    ", i, j, ans, tmp);
                    if(tmp > 8000) break;
                    if(take[tmp] > 0) {
    //                    printf("i:%d j:%d ans:%d tmp:%d
    ", i, j, ans, tmp);
                        ans += take[tmp];
                        take[tmp] = 0;
                    }
                }
            }
    
            printf("%d
    ", ans);
        }
        return 0;
    }
    
    

    F

    //
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int T;
    int oo, ol, ll;
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%d %d %d", &oo, &ol, &ll);
            if(ol != 0 && oo == 0 && ll == 0){
                printf("1");
                for(int i = 1; i <= ol; i++){
                    if(i % 2 == 1) printf("0");
                    else printf("1");
                }
                printf("
    ");
            }
            else if(oo != 0 && ol == 0 && ll == 0){
                printf("0");
                for(int i = 1; i <= oo; i++) printf("0");
                printf("
    ");
            }
            else if(ll != 0 && oo == 0 && ol == 0){
                printf("1");
                for(int i = 1; i <= ll; i++) printf("1");
                printf("
    ");
            }
            else {
                if(oo > 0 && ll > 0){
                    printf("0");
                    for(int i = 1; i <= oo; i++) printf("0");
                    printf("1");
                    for(int i = 1; i <= ll; i++) printf("1");
                    ol--;
                    for(int i = 1; i <= ol; i++){
                        if(i % 2 == 1) printf("0");
                        else printf("1");
                    }
                    printf("
    ");
                }
                else if(oo > 0){
                    printf("0");
                    for(int i = 1; i <= oo; i++) printf("0");
                    for(int i = 1; i <= ol; i++){
                        if(i % 2 == 1) printf("1");
                        else printf("0");
                    }
                    printf("
    ");
                }
                else if(ll > 0){
                    printf("1");
                    for(int i = 1; i <= ll; i++) printf("1");
                    for(int i = 1; i <= ol; i++){
                        if(i % 2 == 1) printf("0");
                        else printf("1");
                    }
                    printf("
    ");
                }
            }
        }
        return 0;
    }
    
    

    G

    //
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int T, n;
    int o[502], t[502];
    
    int main()
    {
        scanf("%d", &T);
        while(T--){
            scanf("%d", &n);
            int co = 0, ct = 0;
            if(n <= 3) printf("-1
    ");
            else if(n == 4) printf("3 1 4 2
    ");
            else {
                for(int i = 1; i <= n; i++){
                    if(i % 2) o[co++] = i;
                    else t[ct++] = i;
                }
                if(n % 2 == 1){
                    for(int i = 0; i < co; i++){
                        printf("%d ", o[i]);
                    }
                    printf("%d %d ", t[ct - 2], t[ct - 1]);
                    for(int i = ct - 3; i >= 0; i--){
                        if(i != ct - 3) printf(" ");
                        printf("%d", t[i]);
                    }
                    printf("
    ");
                }
                else {
                    for(int i = 0; i < ct; i++){
                        printf("%d ", t[i]);
                    }
                    printf("%d %d ", o[co - 2], o[co - 1]);
                    for(int i = co - 3; i >= 0; i--){
                        if(i != co - 3) printf(" ");
                        printf("%d", o[i]);
                    }
                    printf("
    ");
                }
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    判断输入的字符串是否含有特殊字符和表情
    表单转换为JSON
    重写Alert和confirm方法去除地址显示
    C语言内存管理
    自定义C语言中常用的字符串操作函数
    C语言中定义字符串的几种方式
    WebStorm常用快捷键
    鼠标点击特效
    打印指定年份的日历
    VS code 生成.exe可执行文件失效问题
  • 原文地址:https://www.cnblogs.com/Ayanowww/p/12894001.html
Copyright © 2011-2022 走看看