【cf比赛记录】Codeforces Round #613 (Div. 2)

比赛传送门

昨晚的A、B、C题都很简单,结束后都都有4000+的AC数。


A

题意:在 \(x\) 轴的 0 点出发,输出一串字符串代表机器人会向左走或者向右走,因为机器人会出故障,导致有些指令会忽略掉,问机器人最终的落点会有多少个。

题解:直接求机器人能到左右端的极限距离再加上原点即可

// https://codeforces.com/contest/1285/problem/A
#include<iostream>
#include<cstdio>
using namespace std;

int T;
char ch[100005];

int main()
{
    scanf("%d", &T);
    scanf("%s", ch);
    int l = 0, r = 0;
    for(int i = 0; i < T; i++){
        if(ch[i] == 'L') l++;   // 记录左端的最大距离
        else r++;   // 记录右端的最大距离
    }

    printf("%d\n", l + r + 1); // 加上原点
    return 0;
}


B

题意:判断一个数组的全集之和是否严格大于该非空真子集之和

题解:分两部分找非空真子集的最大之和(第一步是除了第一位都取,第二步是除了最后一位都取),然后求最大和的是用最长子序列和来求的

// https://codeforces.com/contest/1285/problem/B
#include<iostream>
#include<cstdio>
using namespace std;

int T, n;
long long num[100005];

int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        long long tot = 0;  // 注意溢出
        for(int i = 0; i < n; i++){
            scanf("%I64d", &num[i]);
            tot += num[i];  // 全集之和
        }

        long long now = 0, big = -2000000000;
        for(int i = 1; i < n; i++){ // 第一步
            now += num[i];
            if(now > big) big = now;
            if(now < 0) now = 0;
        }
        now = 0;
        for(int i = 0; i < n - 1; i++){ // 第二步
            now += num[i];
            if(now > big) big = now;
            if(now < 0) now = 0;
        }

        if(tot > big) printf("YES\n"); // 如果全集之和比最大的非空真子集之和还要大
        else printf("NO\n");
    }
    return 0;
}


C

题意:输入一个数X,找它的因数a, b,并且max(a, b)是最小的一组

题解:a, b必定是数X的因数,因此可以直接找X的因数下手;同时X是a, b的最小公倍数,所以要检验gcd(a, b) == 1;然后记录max(a, b)最小一组即可

// https://codeforces.com/contest/1285/problem/C
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;

LL X, A, B;
LL gcd(LL a, LL b){
    if(b != 0) return gcd(b, a % b);
    else return a;
}

int main()
{
    A = B = 1000000000007;
    int a = 10, b = 5;
    scanf("%I64d", &X);
    for(LL a = 1; a * a <= X; a++){
        if(X % a == 0){
            LL b = X / a;
            if(gcd(a, b) == 1){
                LL c = a > b ? a : b;
                LL ans = A > B ? A : B;
                if(c < ans){
                    A = a; B = b;
                }
            }
        }
    }

    printf("%I64d %I64d\n", A, B);

    return 0;
}


记录菜鸟的成长:

活成了1300分选手的模样

猜你喜欢

转载自www.cnblogs.com/Ayanowww/p/12179487.html