首页 > 其他分享 >AtCoder Beginner Contest 162

AtCoder Beginner Contest 162

时间:2023-01-25 18:11:31浏览次数:50  
标签:AtCoder cnt return Beginner int long dp include 162

A - Lucky 7

大水题,模拟即可。

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
    string s;
    cin >> s;
    if (s[0] == '7' || s[1] == '7' || s[2] == '7') {
        puts("Yes");
    } else {
        puts("No");
    }
    return 0;
}

B - FizzBuzz Sum

还是大水题,模拟。

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
    int n;
    long long ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        if (i % 3 != 0 && i % 5 != 0) {
            ans += i;
        }
    }
    cout << ans;
    return 0;
}

C - Sum of gcd of Tuples (Easy)

这次的前几题怎么都那么水鸭。

数据范围那么小,暴力枚举即可。

#include <iostream>
#include <cstdio>
using namespace std;
int k;
long long ans;
int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}
int main() {
    cin >> k;
    for (int a = 1; a <= k; a++) {
        for (int b = 1; b <= k; b++) {
            int d = gcd(a, b), e;
            for (int c = 1; c <= k; c++) {
                e = gcd(d, c);
                ans += e;
            }
        }
    }
    cout << ans;
    return 0;
}

D - RGB Triplets

枚举前两个数的位置,假设是i,j(\(i < j\))

处理一个后缀颜色数量cnt[x][c]代表从x-n有多少颜色c。

枚举的时候先加上cnt[j+1][除了i,j的另外一种颜色]

然后再判断和i到j等距的那个点有没有被算上,如果被算上了直接减一即可。

#include <iostream>
#include <cstdio>
using namespace std;
long long n;
char s[4010];
long long cnt[4010][3];//0:R 1:G 2:B
long long ans;
long long f(char c) {
    if (c == 'R') return 0;
    if (c == 'G') return 1;
    return 2;
}
long long g(char a, char b) {
    return (3 - f(a) - f(b)) % 3;
}
int main() {
    scanf("%lld%s", &n, s + 1);
    for (long long i = n; i >= 1; i--) {
        cnt[i][0] = cnt[i + 1][0];
        cnt[i][1] = cnt[i + 1][1];
        cnt[i][2] = cnt[i + 1][2];
        cnt[i][f(s[i])]++;
    }
    for (long long i = 1; i < n - 1; i++) {
        for (long long j = i + 1; j < n; j++) {
            if (s[i] == s[j]) continue;
            ans += cnt[j + 1][g(s[i], s[j])];
            if (j + j - i <= n && f(s[j + j - i]) == g(s[i], s[j])) ans--;
        }
    }
    cout << ans;
    return 0;
}

E - Sum of gcd of Tuples (Hard)

简单容斥。

设dp[d]=gcd(a1,a2...an)=d的数列的数量,显然ai得是d的倍数,有\(\frac{k}{d}\)种选择,所以有\({\frac{k}{d}}^n\)个数列。

但是这样会包含gcd=d2,gcd=d3...的答案,所以要减去。

实现的时候倒着循环即可。

#include <iostream>
#include <cstdio>
using namespace std;
const long long mod = 1e9 + 7;
long long n, k;
long long dp[100010], ans;
long long ksm(long long a, long long b) {
    long long ret = 1;
    while (b) {
        if (b & 1) {
            ret = (ret * a) % mod;
        }
        a = (a * a) % mod;
        b >>= 1;
    }
    return ret;
}
int main() {
    cin >> n >> k;
    for (long long i = k; i >= 1; i--) {
        long long num = k / i;
        dp[i] = ksm(num, n);
        for (long long j = i + i; j <= k; j += i) {
            dp[i] = (dp[i] - dp[j] + mod) % mod;
        }
        ans = (ans + dp[i] * i) % mod;
    }
    cout << ans;
    return 0;
}

F - Select Half

设计子状态 \(dp[i]\) 代表前 \(i\) 个数取 \(\frac{i}{2}\) 个数的最大值,显然 \(dp[1]=0\)。

若 \(i\) 为奇数

则若不选 \(i\),答案是 \(dp[i-1]\),若选 \(i\),答案是 \(dp[i-2]+a[i]\),在两者之间取 \(\max\) 即可

若 \(i\) 为偶数,若选 \(i\) 同上,若不选 \(i\) 只有取 \(i-1\) 以内左右编号为奇数的数这一种情况,两者取 \(\max\) 即可。

#include <iostream>
#include <cstdio>
using namespace std;
long long n;
long long a[200010];
long long dp[200010];
long long sum[200010];
int main() {
    scanf("%lld", &n);
    for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
    sum[1] = a[1];
    for (long long i = 3; i <= n; i += 2) {
        sum[i] = sum[i - 2] + a[i];
    }
    for (long long i = 2; i <= n; i++) {
        if (i & 1) {
            dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);
        } else {
            dp[i] = max(sum[i - 1], dp[i - 2] + a[i]);
        }
    }
    printf("%lld", dp[n]);
    return 0;
}

标签:AtCoder,cnt,return,Beginner,int,long,dp,include,162
From: https://www.cnblogs.com/zcr-blog/p/17067114.html

相关文章

  • AtCoder Beginner Contest 172
    A-Calc(abc172a)题目大意给定一个\(a\),输出\(a+a^2+a^3\)解题思路模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=long......
  • 【最短路】Atcoder Beginner Contest 286----E
    题目:E-Souvenir(atcoder.jp)题解:首先这道题可以很容易看出来是求最短路。最开始自己是用bfs写的,出现了WA,TLE,RE等错误。因为对于每种情况会有Q次询问,如果每次询问都......
  • 【多重背包】Atcoder Beginner Contest 286----D
    题目:D-MoneyinHand(atcoder.jp)分析:经典的多重背包。用dp[i]表示i能否正好凑出。先复习一下多重背包。多重背包就是有N组物品,每组最多有k个,每组可以选多个。分组背......
  • AtCoder Beginner Contest 286 解题报告
    AtCoderBeginnerContest286解题报告\(\text{ByDaiRuiChen007}\)ContestLinkA.RangeSwap直接模拟交换过程即可时间复杂度\(\Theta(n)\)#include<bits/stdc++......
  • AtCoder Beginner Contest 286
    A-RangeSwap(abc286a)题目大意给定长度为\(n\)的数组\(a\)和\(p,q,r,s\),交换\(a[p..q]\)和\(a[r..s]\)并输出交换后的数组\(a\)。解题思路模拟即可。神奇......
  • D - Change Usernames -- ATCODER
    D-ChangeUsernameshttps://atcoder.jp/contests/abc285/tasks/abc285_d 思路DFS深度遍历图。需要注意的是,整个大图中可能有很多小的连通子图,每个子图需要确定起......
  • AtCoder Beginner Contest 043
    A-ChildrenandCandies(ABCEdit)n=int(input())print(n*(n+1)//2)B-UnhappyHacking(ABCEdit)用栈模拟一下?但是栈的遍历比较麻烦这里用vector实现#......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies签到#include<bits/stdc++.h>usingnamespacestd;intread(){...}constintN=1e6+5;intmain(){inta=read(),b=read(......
  • Atcoder ABC 285 题解
    E-WorkorRest题意​ 一周有\(n\)天,给出一个长度为\(n\)的数组\(A\)。你可以决定一周中的休息日与工作日的分布,请问如何选择能够使总贡献最大。​ 如何计算贡献......
  • AtCoder Beginner Contest 285 E(背包dp)
    E-WorkorRest题目大意:给定一周有n天,其中至少有1天为休息日,其余为工作日。同时给定一个长度为n的整型数组A,对于一个工作日,它能产生的工作值为A\(_{min(x,y)}\),其中x......