今天连着#9做到了#10.先说最近的#10吧.
第一题: 暴力模拟,没有什么算法或思想可言.就是锻炼代码能力,提高对细节的注意.
第二题: 一开始直接想到了前缀和,算出前缀和后,枚举起点终点,算出差值,判断是否能整除.结果可想而知,直接TLE.后来抓耳挠腮,几番思索无果,果断看题解,将前缀和加以处理,先用前缀和模上d,在遍历一次数组,当Mod == 0 或 当前Mod在之前出现过一次 , 就在结果上+1.
第三题:分饼.有f+1个人分n块饼吃,每块饼都是圆柱体,高全为1,给出每块饼的半径.求每个人都可以分得的饼的最大体积.此题想到了二分,但没有想出如何设计判断条件.看过题解(怎么又是看题解?如此苟蒻考什么NOIp!!)才知将判断条件设定为以当前的体积作为每个人的最大题解来分饼,最多可以分给k个人,若 k >= f+1 ,则说明当前的mid可行,令l = mid ; 否则 令r = mid , 结束条件 l+1< r .
小结:二分还需要加强.二分题的特征:求最大值最小, 或最小值最大.二分的要素:1.区间端点的开或闭 2.条件的判断(即结束时左右端点的意义) 3.结束条件.
第四题:枚举符号.暴力枚举所有组合.在枚举完一种后,再判断此种状态是否合法,合法则输出结果并更新个数,否则return.
第五题:散播谣言.谣言会在关系亲密的人之间传播.现给出所有人之间的关系和直接传播谣言的所需的时间.求散布谣言的最佳起点(可以令谣言散布到所有人所花的时间最短)以及谣言散布到所有人的最短时间.其实就是一个多源最短路.本来可以用folyd的.不过当时思维局限在最短路上,写出了n个SPFA的写法,简直奇葩....
第六题:和奶牛玩游戏.每次查询一段连续区间内的最大值与最小值之差.当初写的时候脑抽了.写查询的时候突发奇想,返回所到区间的最大最小值之差,完全没有考虑剩余区间内与当前区间的最大最小值之差可能大于该区间内的最大最小值之差.OTZ....
改进后,每次查询该区间最大和该区间最小,二者作差即为答案.