刷题网站:洛谷
题目:
P1145 P1276 P1478 P1996 P3984
都是普及-的难度,但是还是有值得注意的点。
P1145 约瑟夫
题目描述
n个人站成一圈,从某个人开始数数,每次数到 m 的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,k 个好人站在一起,k 个坏人站在一起。从第一个好人开始数数。你要确定一个最小的 m,使得在第一个好人被杀死前,k 个坏人先被杀死。
输入格式
一行一个整数 k。
输出格式
一行一个整数 m。
输入输出样例
输入 #1
3输出 #1
5输入 #2
4输出 #2
30说明/提示
0<k<14。
这道题直接暴力搜索即可,但是不用循环模拟过程(模拟过程会浪费大量时间,可能导致TLE),直接用取模运算算出淘汰位置即可。(基础班约瑟夫问题采用直接模拟的方法是可以A掉的)
另外,值得注意的是,在编程中要习惯位置编号等从0开始(而非现实生活中的1),这样既符合数组下标的设置,又会避免一些不必要的麻烦(eg. 在本题,编号从1开始会导致在取模时出现0的情况),提高代码的精准性。
P1276 校门外的树(增强版)
题目描述
校门外马路上本来从编号 0 到 L,每一编号的位置都有一棵树。有砍树者每次从编号 A 到 B 处连续砍掉每一棵树,就连树苗也不放过(记
0 A B
,含 A 和 B);幸运的是还有植树者每次从编号 C 到 D 中凡是空穴(树被砍且还没种上树苗或树苗又被砍掉)的地方都补种上树苗(记1 C D
,含 C 和 D);问最终校门外留下的树苗多少棵?植树者种上又被砍掉的树苗有多少棵?输入格式
第一行,两个正整数 L 和 N,表示校园外原来有 L+1 棵树,并有 N 次砍树或种树的操作。
以下 N 行,每行三个整数,表示砍树或植树的标记和范围。
输出格式
共两行。第一行校门外留下的树苗数目,第二行种上又被拔掉的树苗数目。
输入输出样例
输入 #1
10 3 0 2 6 1 1 8 0 5 7输出 #1
3 2说明/提示
对于 100% 的数据,1≤L≤10000,1≤N≤100。
这道题能够反映出做题者读题的细心程度,有不少坑是埋在题目中的。首先从0到L,一共是L+1棵树,而不是L棵;题目第一个问的是最后校门外剩余的树苗的数量,而不是树和树苗的数量。
再看数据规模,发现纯模拟花费的O()还不错,所以最朴素的解题方法就是模拟。
其余解题方法包括线段树(不过因为询问只有一次,所以不需要实时更新),树状数组。
剩下的题没有特别需要注意的地方,就不赘述了。