马上就退役了,要为下一步做点准备了。先速通一下 GO 语言基础,本文章参考了 GO TOUR 和字节的青训营课程,通过列出一些代码来快速上手 GO 语言。
阅读可能要需要具有其他语言的编程经验
语法
hello,world
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
程序总是从 main 包下的 main 函数开始执行
import 语句可以导入包,除了使用 import 语言单个单个导入外,还可以使用分组导入
import (
"fmt"
"math"
)
函数
func add(x int, y int) int {
return x + y
}
// 缩写
func minus(x, y int) int {
return x - y
}
A. Channel
有 $n$ 个人订阅了一个频道,当前在线 $a$ 人,收到了 $q$ 个上/下线通知
上下线通知不包含上线的用户信息。在最开始的时候 Petya 发了一个视频,请判断是否所有的订阅用户都能看到这个视频
模拟
如果所有的人在同一时刻在线,那么所有用户都能看到
如果在线人数和收到上线通知的次数和大于等于 $n$,则可能都能看见
void solve() {
int n, a, q;
read(n, a, q);
std::string s;
std::cin >> s;
if(a == n){
std::cout << "YES";
return;
}
int online = a;
for(int i = 0; i < q; i++){
if(s[i] == '+'){
CF1844A. Subtraction Game
输入两个数组 $a,b$
两个玩家将一摞$n$个石子堆上进行游戏,玩家一轮可以从石堆中移除 $a$ 个石子或 $b$ 个石子,不能行动的玩家输。
寻找石子堆的石子数量 $n$,使得无论第一个玩家如何行动,第二个玩家总能获胜
*800
只要一共有 $a+b$ 个石子,那么先手必输
void solve() {
i32 a, b;
read(a, b);
std::cout << a+b;
}
CF1842A. Tenzing and Tsondu
Tsondu 和 Tenzing 正在玩纸牌游戏。Tsondu 有 $n$ 个能量为 $a_1, a_2, \ldots,a_n$ 怪物,Tenzing 有 $m$ 个能量为 $b_1, b_2, \ldots, b_m$的怪物
Tsondu 和 Tenzing 轮
A.Increasing and Decreasing
制造一个序列,序列从 $x$ 开始,到 $y$ 结束,一共 $n$ 个数。满足
序列是严格递增的
序列相邻两项的值是严格递减的
构造 *579
直接从 $y$ 开始构造一个倒序构造一个递减序列,使每次减少的值在不重复的情况下尽可能小
void solve(){
int x, y, n;
read(x, y, n);
std::vector<int> d(n);
d[n-1] = y;
for(int i = 2; i <= d.size(); i++){
d[d.size() - i] = d[d.size() - i + 1] - (i - 1);
}
if(x > d[0]){
std::cout <&l
A. Gift Carpet
输入一个 $n$ 行 $m$ 列的字符矩阵,判断矩阵中从前往后的列中能不能找到特定的字符组成 vika
暴力
直接旋转矩阵然后暴力判断 :)
T = int(input())
def solve():
r, c = list(map(int, input().split()))
s = [input() for i in range(r)]
s[::] = [[row[i] for row in s[::-1]] for i in range(len(s[0]))]
s = ["".join(i) for i in s]
v, vi, vik, vika = [False, False, False, False]
for line in s:
if vik and 'a' in line:
vika = T
A. 判别首字母缩略词
给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。
如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的首字母缩略词。
例如,"ab" 可以由 ["apple", "banana"] 形成,但是无法从 ["bear", "aardvark"] 形成。
如果 s 是 words 的首字母缩略词,返回 true ;否则,返回 false 。
模拟
class Solution {
public:
bool isAcronym(vector<string>& words, string s) {
std::string ans;
for(auto s: words) ans += s[0];
A. Not a Substring
给一个仅由 ( 和 ) 组成的字符串$a$,它的长度为 $n$。要求构造一个长度为 $2n$ 的新字符串 $b$,且 $a$ 不是 $b$ 的连续子串。输出新字符串 $b$。
构造
很明显一个字符串如果是 (((()))) 的子字符串,那它一定不是 ()()()() 的子字符串。因此只需要构造出两个字符串进行判断即可。
void solve() {
std::string s;
std::cin >> s;
std::string s1, s2;
rep(i, s.size()) {
s1 += "()";
s2 += "(";
}
rep(i, s.size()) { s2 += ")"; }
if (s1.find(s) == std::string::npos) {
std::
A. Array Coloring
给一个长度为 $n$ 的数组,判断数组能否分为两组元素的加和的奇偶性相同的两组
思维
考虑数组中奇数的数量,由于奇数 + 奇数 = 偶数,奇数 + 偶数 = 奇数,如果有偶数个奇数,我们可以将奇数其平分到两个数组中,否则无论如何都无法满足条件
void solve(const std::size_t testcase) {
multitest{
std::vector<i32> s(n);
reads(all(s));
int odd = 0;
for(auto i : s)
if(i % 2 != 0)
odd++;
std::cout << (odd % 2 == 0 ? "YES": "NO");
}
}
B. Maximum Rounding
周围的人都写了篇小作文, 那我也跟按照圈子里的惯例写个小流水帐吧,文笔不好,算给日后的自己留个纪念吧
首先恭喜我校2银3铜, 听说是校史上就牌子数量的的最好成绩. 其次恭喜我自己终于拿到了XCPC上的第一块牌子(算是弥补了去年打铁的遗憾, RK55 也算是一个好开始吧).
这次的队伍算是重组后的队伍, 前前后后自行进行了几场训练, 也参加了几场学校里的自行组织的几场训练, 现在回想起来这些确实给我们队伍的合作提供了很大的帮助. 十分感谢学校提供的训练场地(尽管有点难以描述)和 yrh lmy 等人的帮助. 不同于 lmy 的队伍, 我们队其实是到学校统一组织训练的时候才知道出题人是 SUA 并开始专门挑 SUA 的题目训练, 如果不是因为 lmy 的消息和 yrh 及学校老师组织的训练, 我们队伍这次比赛大概并不会这么轻松愉快.
day(-9) 突然抗原阳了,在此之前我还没阳过, 在家里烧
比赛链接
C - Cat virus
对于一颗树, 它的节点可以被染为黑色或者白色. 如果一个节点是白色,那么她的子节点可以是白色,也可以是黑色. 如果这个节点是黑色, 那么她的子节点一定是黑色. 现在输入一个数字 $2\le K \le 2\times 10^{18}$, 根据上述方式构造一棵数, 使之不同的染色方式有 $K$ 种
思维 构造
刚开始做的时候没带脑子,直接构造了一个 $(1,2), (2,3) \ldots (n-1, n)$,结果狠狠的 TLE
反向思考,当 $x$ 为白色的时候,它的父节点一定也为白色,而当这个节点是黑色的时候,它的父节点可以是白色,也可以是黑色.
设节点 a 及其子树有 $n$ 中染色方式, 增加一节点 b 连接到 a, 有以下情况:
当 a 为黑色时, 所有节点都为黑色, 1 种染色方式
当 a 为白色, b 为黑色时, 有 $n-1$ 中染