【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;
}

原文地址:https://www.cnblogs.com/Ayanowww/p/12894001.html