HAOI2013 的特点
题水
谁说的。。。
做了大半年的题你跟我说水。。。
欸,似乎真的很水。。。
大概是我太水吧。。。
T1 [HAOI2013] 跑步训练
题目描述
Dr.Kong准备参加冬季越野比赛。为了能在比赛中有好的发挥,他决定每天早上上班前在附近的一条山路上开始训练。他当然希望每次训练中跑得尽可能远,但他的时间有限,每天早上跑步训练的时间不得超过M秒 (1 <= M <= 10,000,000)。
为了合理的安排跑步路程,Dr.Kong将整条山路划分成T个长度相同的小段(1 <= T <= 100,000),并且,分别用u,f,d这3个字母之一来表示每个小段是上坡、平地,或是下坡。 Dr.Kong要花t1秒(1 <= t1 <= 100)才能跑完一段上坡路,跑完一段平地的耗时是
t2秒(1 <= t2 <= 100),跑完一段下坡路要花t3秒(1 <= t3 <= 100)。注意,沿山路原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成了上坡路。
Dr.Kong想知道,在不超过M秒内返回的前提下,他最多能在这条山路上跑多远。
输入格式
第1行: M T t1 t2 t3 (数据之间用一个空格隔开)
第2..T+1行: 每行为1个字母u或f或d,描述了相应段的山路路况(上坡、平地,或是下坡)
输出格式
输出1个整数,为Dr.Kong在不超时回到的前提下,最多能跑到几段。
样例输入
13 5 3 2 1
u
f
u
d
f
样例输出
3
cogs评分半星。。。
解法
就是用一个整型s存达到当前步数要走的来回的耗时
然后每走一段路程加上耗时与返回时的耗时,s > M 并且step <= t时结束程序,输出step - 1
贴代码
|
|
T2[HAOI2013] 花卉节
题目描述
ZZ市准备在绿博园举办一次花卉节。Dr.Kong接受到一个任务,要买一批花卉进行布置园林。
能投入买花卉的资金只有B元 (1 <= B <= 10^18) 。Dr.Kong决定做一个社会调查,统计一下市民们都喜欢哪种花卉,以便在有限的资金范围内,让更多的市民都能找到并标注一盆自己喜欢的花卉(一盆花只能一位市民标注)。
经调查统计,市场上有N (1 <= N<=100,000)种不同类型的花卉,第i种花卉的价格是Pi(1 <= Pi <= 10^18) 。有Ci (1 <= Ci <= 10^18) 个市民喜欢。
你能帮助Dr.Kong计算一下,在不透支的情况下,如何购买花卉才能让更多的市民都能找到并标注一盆自己喜欢的花卉?
例如:Dr.Kong 有 50块钱,有5种不同类型的花卉:
显然,Dr.Kong不能购买第5种类型的花卉,因为他不够钱。
下面的购买方案是最优的:
第1种花卉买3盆;第2种花卉买1盆;第3种花卉买2盆;第4种花卉买2盆。
总共花费:5_3+1_1+10_2+7_2=50,这样,Dr.Kong 最多能让3+1+2+2 =8 人满意。
输入格式
第1行: N B
第2..N+1行: Pi Ci (i=1,2,….,N)。
输出格式
一个整数,最多可以让多少市民满意。
样例输入
5 50
5 3
1 1
10 4
7 2
60 1
样例输出
8
解法
算是一道很简单的贪心吧(是吧,反之就是很水,但因为要用到高精所以不水了(其实还是很水吧。。。
先将所有花的种类按照价格从小到大排序,然后尽可能多买便宜的花就行了,所以真的水我也就WA了3遍
贴代码
先把低精的代码贴上来
低精50分版
高精版随后贴上3/20/2017 6:30:43 PM
|
|
高精全A版
|
|
long long 全A版
打完高精之后看了看天天的rank2代码突然发现不加高精也能过,然后就换了个结构自己码了一遍,但跑的还是没有天天的快,气哭
|
|
T3[HAOI2013] 开关控制
题目描述
元宵节快要到了,某城市人民公园将举办一次灯展。Dr.Kong准备设计出一个奇妙的展品,他计划将编号为1到N的N(1 <= N <= 35)盏灯放置在一个有M条(1 <= M <= 595)边连接的网络节点上。
每盏灯上面都带有一個开关。当按下某一盏灯的开关時,这盏灯本身以及与之有边相连的灯的状态就会改变。状态改变指的是:当一盏灯是亮时,就会被关闭;当一盏灯是关闭时,就会被打开亮着。
现在的问题是,你能帮助Dr.Kong计算一下最少要按下多少个开关,才能把所有的灯都打开亮着(初始状态:所有的灯都是关闭的)。
数据保证至少有一种按开关的方案,使得所有的灯都能被重新打开。
输入格式
第1行: N M
第2到第M+1行:每一行有两个由空格隔开的整數,表示两盏灯被一条边连接。
输出格式
一个整数,表示要把所有的灯都打开时,最少需要按下的开关次数。
样例输入
5 6
1 2
1 3
4 2
3 4
2 5
5 3
样例输出
3
解法
听天天讲了好久终于搞明白怎么做了。。。
首先,证明每个灯按2次之后的的状态和按2次前的状态一样,因此每个灯最多按一次。
其次,想要让保证当前灯的状态是亮着,前提条件是与这个灯相连的灯(包括当前灯)中有奇数个灯的按钮被按过。设g[i][j]表示灯i是否连接到灯j,x[i]表示i这个灯是否被按过。由这条性质,我们发现,可以列出一个方程(xor 为 异或^)
异或的性质:相同为0,不同为1
然后就是运用高斯消元,讲方程系数消到一个上三角矩阵。 代码实现
|
|
消元之后,因为存在自由元的i行的灯xi可选择开,也可选择不开,因此要进行dfs找结果
代码实现
|
|
T4[HAOI2013] 软件安装
解法
需要用到区间的查询与更改,所以自然而然的想到了线段树,但是困难的是线段树要维护什么。这道题要求查询符合长度要求的空区间的起始位置,所以要维护m:区间内最长空区间的长度,mp:区间最长空区间的起始位置。因为一定会有一段区间的最长空区间跨过两个子区间,而又不是两个子区间的最长空区间的情况,所以还要维护两个值lm:区间左端点之后的最长连续空区间的长度,rm:到右端点的最长连续空区间的长度。有了这4个值,才能对区间的最长空区间的起始位置进行查找。还有一点要注意的是因为优先选择左边的可行区间的起点,所以逻辑判断时候要考虑上这种情况。
代码
|
|
T5[HAOI2013] 遥控器
解法
据说floyd也可以过,感觉好神奇,然而我打了一个模拟,要注意的细节很多
|
|
写在最后
话说模块化代码真爽啊