比赛链接:https://atcoder.jp/contests/abc162/tasks

A - Lucky 7

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. int n; cin >> n;
  5. cout << (to_string(n).find("7") != -1 ? "Yes" : "No");
  6. }

B - FizzBuzz Sum

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4. int main() {
  5. ll n; cin >> n;
  6. ll ans = 0;
  7. for (ll i = 1; i <= n; i++) {
  8. if (i%3 && i%5) ans += i;
  9. }
  10. cout << ans;
  11. }

C - Sum of gcd of Tuples (Easy)

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4. int main() {
  5. ll k; cin >> k;
  6. ll ans = 0;
  7. for (ll a = 1; a <=k ; a++) {
  8. for (ll b = 1; b <= k; b++) {
  9. for (ll c = 1; c <=k; c++) {
  10. ans += __gcd(__gcd(a,b),c);
  11. }
  12. }
  13. }
  14. cout << ans;
  15. }

D - RGB Triplets

题意

一字符串由 $RBG$ 组成,找出三元组 $(i, j, k)$ 满足:

  • $i<j<k$
  • $s[i]!=s[j]\ \&\&\ s[i]!=s[k]\ \&\&\ s[j]!=s[k]$
  • $j-i\ !=\  k-j$

思路一

存储 $3$ 个字母的位置,枚举 $9$ 种前后情况,二分查找满足 $j>i,k>j$ 的下标。

代码一

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4.  
  5. int n; string s;
  6. vector<int> v[3];
  7.  
  8. inline int idx(int b, int a, int i) { //在 v[b] 中寻找第一个不小于 v[a][i] 的下标
  9. return upper_bound(v[b].begin(), v[b].end(), v[a][i]) - v[b].begin();
  10. }
  11.  
  12. ll cal(int a, int b, int c) {
  13. ll ret = 0;
  14. for (int i = 0; i < v[a].size(); i++) {
  15. for (int j = idx(b, a, i); j < v[b].size(); j++) {
  16. for (int k = idx(c, b, j); k < v[c].size(); k++) {
  17. if (v[b][j] - v[a][i] != v[c][k] - v[b][j]) { //等价于条件中的 j - i != k - j
  18. ++ret;
  19. }
  20. }
  21. }
  22. }
  23. return ret;
  24. }
  25.  
  26. int main() {
  27. cin >> n >> s;
  28. for (int i = 0; i < n; i++) { //存储不同字母的位置
  29. if (s[i] == 'R') v[0].push_back(i);
  30. else if (s[i] == 'G') v[1].push_back(i);
  31. else v[2].push_back(i);
  32. }
  33. ll ans = 0;
  34. for (int i = 0; i < 3; i++) { //枚举RGB的前后情况
  35. for (int j = 0; j < 3; j++) {
  36. for (int k = 0; k < 3; k++) {
  37. if (i != j && i !=k && j != k) {
  38. ans += cal(i, j, k);
  39. }
  40. }
  41. }
  42. }
  43. cout << ans;
  44. }

思路二

求出总的情况数减去不满足条件的情况。

代码二

  1. #include <bits/stdc++.h>
  2. #define c1 s[i]
  3. #define c2 s[i + d]
  4. #define c3 s[i + d + d]
  5. using ll = long long;
  6. using namespace std;
  7. int main() {
  8. int n; cin >> n;
  9. string s; cin >> s;
  10. int a[3] = {};
  11. for (char c : s) {
  12. if (c == 'R') ++a[0];
  13. else if (c == 'G') ++a[1];
  14. else ++a[2];
  15. }
  16. ll ans = 1LL * a[0] * a[1] * a[2];
  17. for (int i = 0; i < n - 2; i++) {
  18. for (int d = 1; i + d + d < n; d++) {
  19. if (c1 != c2 and c1 != c3 and c2 != c3)
  20. --ans;
  21. }
  22. }
  23. cout << ans;
  24. }

E - Sum of gcd of Tuples (Hard)

题意

有 $n$ 个大小为 $1{\sim}k$ 的数,找出所有情况中的 $gcd(a_1,a_2,...,a_n)$ 之和。

思路

设 $gcd_i$ 为 $gcd(a_1,a_2,...,a_n)=i$ 的排列个数,答案即 $\sum_{i=1}^{k}i{\times}gcd_i$。

$k$ 中 $i$ 的倍数有 $\lfloor \frac{k}{i} \rfloor$ 个,所以 $gcd=i$ 的情况共有 ${\lfloor \frac{k}{i} \rfloor}^n$ 种,但这其中有重复的情况,比如当计算 $gcd=2$ 时,同时也会得到 $gcd=4、6、8$ 等等的排列,所以我们需要从 $\frac{k}{2}$ 起反向遍历减去重复的情况。

代码

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4.  
  5. const ll mod = 1e9 + 7;
  6.  
  7. ll fpow(ll a, ll b) { ll ret = 1; while (b) { if (b & 1) ret = ret * a %mod; a = a * a % mod; b >>= 1; } return ret; }
  8.  
  9. int main() {
  10. ll n, k; cin >> n >> k;
  11. ll gcd[k+1] = {};
  12. for (int i = 1; i <= k; i++)
  13. gcd[i] = fpow(k / i, n);
  14. for (int i = k / 2; i >= 1; i--)
  15. for (int j = i + i; j <= k; j += i)
  16. gcd[i] -= gcd[j];
  17. for (int i = 1; i <= k; i++)
  18. gcd[i] = i * gcd[i] % mod;
  19. cout << accumulate(gcd + 1, gcd + 1 + k, 0LL) % mod;
  20. }

F - Select Half

题意

有 $n$ 个数,求取 $\lfloor\frac{n}{2}\rfloor$ 个两两不相邻的数的最大和。

思路

设 $dp[i]$ 为长为 $i$ 时取 $\lfloor\frac{i}{2}\rfloor$ 个数的最大和。

当 $i$ 为奇数时,如果取 $a_i$,$dp_i=dp_{i-2}+a_i$,否则 $dp_i=dp_{i-1}$。

当 $i$ 为偶数时,如果取 $a_i$,$dp_i=dp_{i-2}+a_i$,否则 $dp_i=pre\_sum_{i-1}$。

比如当 $i=4$ 时,如果不取 $a_4$,要想在之前的 $a_1\ a_2\ a_3$ 中取够 $2$ 个数,只能取 $a_1\ a_3$,即从  $a_1$ 起间隔为 $2$ 取数作奇数位的前缀和。

代码

  1. #include <bits/stdc++.h>
  2. using ll = long long;
  3. using namespace std;
  4. int main() {
  5. int n; cin >> n;
  6. int a[n + 1]; for (int i = 1; i <= n; i++) cin >> a[i];
  7.  
  8. ll pre_sum[n + 1] = {};
  9. pre_sum[1] = a[1];
  10. for (int i = 3; i <= n; i += 2)
  11. pre_sum[i] = pre_sum[i - 2] + a[i];
  12.  
  13. ll dp[n + 1] = {};
  14. for (int i = 2; i <= n; i++) {
  15. if (i & 1) {
  16. dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);
  17. } else {
  18. dp[i] = max(pre_sum[i - 1], dp[i - 2] + a[i]);
  19. }
  20. }
  21. cout << dp[n];
  22. }

AtCoder Beginner Contest 162的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

随机推荐

  1. 查找linux系统下的端口被占用进程的两种方法 【转】

    在linux下开发时,你的软件可能要使用某一个端口,或者想查找某一个端口是否被占用.需要怎么做呢??这的确是一个比较烦恼的问题,我也此为这个苦恼过.但是通过查找man手册,还是同事的交流.总结出来两种 ...

  2. Centos 6 下安装 OSSEC-2.8.1 邮件告警 (二)

    Ossec 配置邮件通知 ## 1 安装软件包: yum install -y sendmail mailx cyrus-sasl cyrus-sasl-plain #安装postfix邮件相关的软件 ...

  3. k8s之ServiceAccount

    导读 上一篇说了k8s的RBAC授权模式,今天就来简单看一下其中涉及到的ServiceAccount. 简介 k8s创建两套独立的账号系统,原因如下: (1)User账号给用户用,Service Ac ...

  4. Java开发手册之安全规约

    1.用户敏感数据禁止直接展示,必须对展示数据进行脱敏.例如手机号.银行卡号等,中间要用*隐藏. 2.发贴.评论.发送即时消息等用户生成内容的场景必须实现防刷.文本内容违禁词过滤等风控策略,一般是用验证 ...

  5. Eureka详解系列(一)--先谈谈负载均衡器

    这个系列开始研究 Eureka,在此之前,先来谈谈负载均衡器. 本质上,Eureka 就是一个负载均衡器,可能有的人会说,它是一个服务注册中心,用来注册服务的,这种说法不能说错,只是有点片面. 在这篇 ...

  6. 干电池升压5V,功耗10uA

    PW5100干电池升压5V芯片 输出电容: 所以为了减小输出的纹波,需要比较大的输出电容值.但是输出电容过大,就会使得系统的 反应时间过慢,成本也会增加.所以建议使用一个 22uF 的电容,或者两个 ...

  7. CMU数据库(15-445)实验2-b+树索引实现(上)

    Lab2 在做实验2之前请确保实验1结果的正确性.不然你的实验2将无法正常进行 环境搭建地址如下 https://www.cnblogs.com/JayL-zxl/p/14307260.html 实验 ...

  8. CentOS7 通过snat进行上网

    需求: 有两台服务器,一台绑定了弹性公网IP,另外一台没有,需要内网服务器通过有弹性ip的机器代理进行上网. 环境: centos7 操作系统 服务器A: 192.168.0.18 (可以上网,有弹性 ...

  9. 查看内核打印信息指令dmesg

    linux系统启动的时候打印的的信息非常重要,有时候需要看这些信息但是又不想重启,可以用dmesg这条指令.

  10. 全栈性能测试修炼宝典-JMeter实战笔记(三)

    JMeter体系结构 简介 JMeter是一款开源桌面应用软件,可用来模拟用户负载来完成性能测试工作. JMeter体系结构 X1~X5是负载模拟的一个过程,使用这些组件来完成负载的模拟 Y1:包含的 ...