20191201(报数)

代码1
写一个canSkip(int x) 函数,判断一个数是否可以跳过,设置数组skip[]表示每个人跳过的次数。在循环中,判断num是第a=(num-1)%4的人报数;若num可以跳过,则skip[a]++, 否则,循环计数n减1;然后num++;n==0时循环结束。
1 | //freopen("D://input.txt","r",stdin); |
20191202(回收站选址)

代码1
用vector<array<int,2>> pos 存储所有的垃圾点,然后建立倒排索引:点坐标的哈希值到pos中对应下标的映射map<long long, int> mp。例如,<10e9, 10e9>的哈希值为(10e9+10e9)*(2*10e9+1)+(10e9+10e9),它对应pos中的下标0。
写一个哈希函数long long hash(int x, int y)。用vector<array<int,8>> flag 表示每个点的8个相邻位置是否有垃圾站,当一个点A的右方检查到有垃圾站B时,B的左方也可以设置为由垃圾站。遍历pos,来更新flag,再遍历一遍pos,看每个垃圾站的分数,并记录每个分数的垃圾站个数,int score[5]。
1 | //freopen("D://input.txt","r",stdin); |
20191203(化学方程式)

代码1
思路:vector<int> numLeft(27*27) 和 vector<int> numRight(27*27)分别表示 等式左右两边的各个元素的个数,若numLeft与numRight完全相同,则等式匹配,否则,不匹配。
我们写一个dealItem(string str, int a, vector<int>& num) 来处理一个化合物,也就是加好或等号之间的字符串,例如4Na(Au(CN)2)2,这个函数是个递归函数,递归出口是str是一个只有字母的字符串,而没有数字与括号,a表示对于每个元素,需要乘的倍数,num是输出参数。对于这个例子,处理过程为,进入1层dealItem,处理4Na(Au(CN)2)2,然后进入2层dealItem,处理Na(Au(CN)2)2,a=4,然后累加Na的个数,然后进入3层dealItem,处理Au(CN)2,倍数是8,累加Au的个数,然后进入4层dealItem,处理CN,倍数是16,累加C,N。
1 | //freopen("D://input.txt","r",stdin); |
20191204(区块链)
代码1
我们设置一个节点的结构为:
1 | struct Node{ |
在接收k个处理的时候,若是产生一个新块,则让对应节点的mp1更新。有一个系统时间time=0,当你要查询i时刻的某个节点的链子的时候,要从time开始模拟传播和链更新过程,并把mp1和mp2中已经更新到Link中的项目给删除掉。
1 | //freopen("D://input.txt","r",stdin); |
错误,40分。题目给的测试用例都过了。
测试用例
1 | 5 10 |
1 | 15 13 |
代码2
可以直接存储<时刻,所有结点产生的块或接收的链>,比如可以这样写数据结构:map<int, unordered_map<int, array<vector<int>,2>>> ,外层map建立时刻与所有结点产生的块或接收的链之间的映射,内层unordered_map建立结点编号与产生的块或接收的链之间的映射,这个时候用无序map更好,因为查询操作更多,array<vector<int>,2>的第一个部分是产生的块,第二各部分是接收的链,其实这个时候可以接收很多链,但是通过比较,只留下最优的那个。