USACO讲义合集.docx
《USACO讲义合集.docx》由会员分享,可在线阅读,更多相关《USACO讲义合集.docx(85页珍藏版)》请在冰豆网上搜索。
USACO讲义合集
2009年暑假集训讲义
2009年暑假集训讲义
上海交通大学马融
上海交通大学马融
第一讲穷举与贪心...................................................................................................................3
集市班车(FairShuttle,USACO2009Feb)...............................................................................4
翻转棋(Fliptile,USACO2007Nov)..........................................................................................5
翻转奶牛(FaceTheRightWay,USACO2007Mar).................................................................6
第二讲背包问题.......................................................................................................................7
分数膨胀(ScoreInflation,USACO3.1)....................................................................................8
货币系统(MoneySystems,USACO2.3)..................................................................................9
奶牛博览会(CowExhibition,USACO2003Nov)...................................................................10
太空电梯(SpaceElevator,USACO2005Mar).......................................................................11
牛奶量取(MilkMeasuring,USACO5.3)................................................................................12
第三讲动态规划选讲.............................................................................................................13
抓苹果(AppleCatching,USACO2004Nov)..........................................................................15
最廉回文(CheapestPalindrome,USACO2007Open)..........................................................17
麦香牛块(BeefMcNuggets,USACO4.1)..............................................................................19
道路重建(RebuildingRoads,USACOFeb2002)....................................................................20
第四讲最小生成树问题.........................................................................................................22
建造道路(BuildingRoads,USACO2007Dec).......................................................................23
安慰奶牛(CheeringuptheCows,USACO2008Nov)...........................................................24
地震(Earthquake,USACO2001Open)..................................................................................26
第五讲最短路径问题.............................................................................................................28
道路翻新(RevampingTrails,USACO2009Feb)....................................................................29
道路障碍(Roadblocks,USACO2006Nov)............................................................................31
奶牛慢跑(CowJogging,USACO2008Mar)..........................................................................33
第六讲广度优先遍历.............................................................................................................35
青铜莲花池(BronzeLilypadPond,USACO2007Feb)...........................................................36
白银莲花池(SilverLilypadPond,USACO2007Feb).............................................................37
黄金莲花池(LilypadPond,USACO2007Feb).......................................................................39
第七讲USACO竞赛试题选讲................................................................................................41
哞哞大学之奖学金(MooUniversity-FinancialAid,USACO2004Mar)..............................42
哞哞大学之校队选拔(MooUniversity-TeamTryouts,USACO2004Mar).........................44
哞哞大学之匹萨预定(MooUniversity-EmergencyPizzaOrder,USACO2004Mar)..........46
第八讲USACO竞赛试题选讲(续)....................................................................................48
黄金平衡(USACO2007Mar)................................................................................................49
奶牛排名(RankingtheCows,USACO2007Mar)..................................................................50
奶牛交通(CowTraffic,USACO2007Mar).............................................................................51
校庆聚会(Ural1039).............................................................................................................52
第九讲线段树.........................................................................................................................54
2009年暑假集训讲义
USACO题目中常见的单词:
pasture牧场
barn牛棚
trail小路
grazinglocation放牧地点
intersection十字路口
FJ农夫约翰(FarmerJohn)的缩写
Bessie贝西,一头非常聪明的母牛
hay干草
hoof牛蹄(复数hooves)
上海交通大学马融
2009年暑假集训讲义
第一讲穷举与贪心
上海交通大学马融
2009年暑假集训讲义
集市班车(FairShuttle,USACO2009Feb)
上海交通大学马融
逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻
炼——如果要逛完一整天的集市,他们一定会筋疲力尽的。
所以为了让奶牛们也能愉快地逛
集市,约翰准备让奶牛们在集市上以车代步。
但是,约翰木有钱,他租来的班车只能在集市上沿直线跑一次,而且只能停靠
N(1≤N≤20000)个地点(所有地点都以1到N之间的一个数字来表示)。
现在奶牛们分成
K(1≤K≤50000)个小组,第i组有Mi(1≤Mi≤N)头奶牛,他们希望从Si跑到Ti(1≤Si<
Ti≤N)。
由于班车容量有限,可能载不下所有想乘车的奶牛们,此时也允许小组里的一部分奶牛
分开乘坐班车。
约翰经过调查得知班车的容量是C(1≤C≤100),请你帮助约翰计划一个尽
可能满足更多奶牛愿望的方案。
输入格式
●第一行:
包括三个整数:
K,N和C,彼此用空格隔开。
●第二行到K+1行:
在第i+1行,将会告诉你第i组奶牛的信息:
Si,Ei和Mi,彼此用空
格隔开。
输出格式
●第一行:
可以坐班车的奶牛的最大头数
样例
shuttle.in
8153
152
13141
583
8142
14151
9121
12152
461
解题思路
shuttle.out
10
(班车可以把2头奶牛从1送到5,3头奶牛从
5送到8,2头奶牛从8送到14,1头奶牛从9送
到12,1头奶牛从13送到14,1头奶牛从14送
到15)
贪心,在任何时刻总是带最早下车的奶牛,证明略。
2009年暑假集训讲义
翻转棋(Fliptile,USACO2007Nov)
上海交通大学马融
农夫约翰知道,聪明的奶牛可以产更多的牛奶。
他为奶牛设计了一种智力游戏,名叫翻
转棋。
翻转棋可以分成M×N(1≤M,N≤15)个格子,每个格子有两种颜色,一面是黑的,
一面是白的。
一旦翻转某个格子,这个格子的颜色就会颠倒。
如果把所有的格子都翻成白的,就算奶
牛赢了。
然而,奶牛的蹄子很大,一旦它们打算翻转某个格子,这个格子附近(即和这个格
子有公共边)的格子也会被翻转。
一直翻来翻去也很无聊,奶牛们想最小化必须翻动的次数。
请帮助奶牛确定翻动的最少次数和具体的翻法。
如果最小解有多个,则输出在字典序意
义下最小的那个,如果不可能完成任务,则只要输出一行单词:
IMPOSSOBLE。
输入格式
●第一行:
两个用空格分开的整数:
M和N
●第二行到M+1行:
第i+1行从左至右依次描述了棋盘第i行的的颜色,共记N个用空格
分开的整数,1代表黑色,0代表白色。
输出格式
●第一行到第M行:
每行输出N个用空格分开的整数,表示在这个格子上翻转的次数。
样例
fliptile.in
44
1001
0110
0110
1001
解题思路
fliptile.out
0000
1001
1001
0000
(另外还有一个解是
0110
0000
0000
0110
但是这个解在字典序意义下没有样例来得
小)
如果第一行的翻法固定了,其余行的翻法是固定的,所以只要穷举第一行的翻法就可以了。
2009年暑假集训讲义
上海交通大学马融
翻转奶牛(FaceTheRightWay,USACO2007Mar)
农夫约翰把N(1≤N≤5000)头奶牛排成了一行,其中大部分的奶牛都很好,他们的脸
都朝向正面,但就有一小撮的奶牛是朝向背面的,为了追求完美,约翰决定要让所有的牛都
朝向正面。
幸运的是,约翰最近刚买了一部自动翻牛机。
不过因为他买的是打折机型,所以事先必
须要设定单次翻转的牛头数K(1≤K≤N),一旦固定,就再也不能修改了。
而且这台机器
只能同时翻转站在一起的奶牛,每次使用的时候,它会翻转相邻的K头奶牛(不能少于K头,
就算靠在队列的两个端点上也一样),一头牛在被翻转之前是朝向正面的,使用之后就会被
翻到背面去了,反之亦然。
由于约翰只能选一个不可以修改的K,所以请帮他确定一个K,使得使用机器的次数最
少,同时,也请把这个最少的次数M求出来(如果有多个K满足条件,输出最小的那个)。
输入格式
●第一行:
单个整数:
N
●第二行到第N+1行:
第i+1行只有一个字符B或F,表示第i头奶牛是朝向正面(F)还
是背面的(B)。
输出格式
●第一行:
两个用空格分开的整数:
K和M
样例
cowturn.in
7
B
B
F
B
F
B
B
解题思路
cowturn.out
33
(选择K=3,翻转三次:
(1,2,3),(3,4,5),
(5,6,7)即可)
枚举K,从头扫描需要翻转的点,每个点的状态只和它前K−1个点翻转次数的奇偶性有关,
所以可以在线性时间内求出对应的M,总的时间复杂度为O(n2)。
2009年暑假集训讲义
第二讲背包问题
参考资料:
基本理论
上海交通大学马融
问题
子问题
给定n个物品的价值vi和重量wi,在总重量不超过...(恰好为...)C的情况下,求最
优的背包方案
f[i,j]:
只使用前i个物品,在总重量不超过...(恰好为...)j的情况下,可以达到的最
优的背包方案
边界条件
递推公式
目标函数
“不超过”
“恰好为”
f0,0=f0,1=⋯=f0,C=0
f0,0=0,f0,1=⋯=f0,C=−∞
fi,j=maxfi−1,j,fi−1,j−wi+vi
f[n,C]
背包问题的变化
●01物品:
每个物品只能选择“取”(0)或“不取”
(1)
●无限物品:
每个物品可以取任意多个或一个也不取
●多重物品:
每个物品可以取的次数有一个对应的上界
●多费用物品:
每个物品占用的资源有多个
●分组物品:
每个物品都在一个组里,同一个组里的物品只能选择一个(或若干多个)
●附件物品:
附件物品必须在主件物品被选择后才能选取
●输出最优方案
●输出第k优的解(vijos1412)
下面两个程序都是正确的(01背包vs无限背包)
fillchar(f,sizeof(f),0);
fori:
=1tondo
forj:
=mdowntov[i]do
f[j]:
=
max(f[j],f[j-v[i]]+w[i]);
writeln(f[m]);
fillchar(f,sizeof(f),0);
fori:
=1tondo
forj:
=v[i]tomdo
f[j]:
=
max(f[j],f[j-v[i]]+w[i]);
writeln(f[m]);
2009年暑假集训讲义
分数膨胀(ScoreInflation,USACO3.1)
上海交通大学马融
选手在USACO竞赛中得分越高我们就越高兴。
我们要让选手在竞赛中能够得到更多的
分数,这需要你的帮忙。
竞赛题目可以按题型来分类,每个题型中的题目是无限多的。
解决同一类问题的时间和
得分都是一样的。
你的任务是写一个程序来告诉USACO的工作人员,应该从每种题型中选
取多少题目,才能让选手在规定的时间内获得最多的分数?
输入包括竞赛总时间M(1≤M≤10000)(不要担心,你如果不来集训营是不会有这么
长的比赛时间的)和题型的总数N(1≤N≤10000)。
接下来的每一行将包括两个整数来描
述一种题型:
第一个整数表示这类题目的得分(1≤得分≤10000),第二个整数表示这类
题目的耗时(1≤耗时≤10000)。
你的程序要帮助我们确定从每类题目中选多少才能在竞赛时间内获得最大的总分。
注意
每种题型的题目可以不取、只取一道或很多道,请算出选手能够得到的最大分数。
输入格式
●第一行:
两个正整数:
M和N,表示竞赛的总时间和题目类型的数目
●第二行到第N+1行:
每行两个整数,分别表示每个题型的得分和耗时
输出格式
●第一行:
能够得到的最大分数
样例
inflate.in
3004
10060
250120
120100
3520
解题思路
典型的无限背包。
inflate.out
605
(从第二种类型中取出4道,再从第四种类
型中取出3道)
原问题
子问题
边界条件
递推公式
目标函数
给定N种题目的时间mti和分数pti,在总时间不超过M下的最大分数
f[i,j]:
只使用前i种类型的题目,在总时间不超过j下的最大分数
f0,0=f0,1=⋯=f0,M=0
fi,j=maxfi−1,j,fi,j−mti+pti
f[N,M]
2009年暑假集训讲义
货币系统(MoneySystems,USACO2.3)
上海交通大学马融
奶牛们不但创建了自己的政府,而且建立了自己的货币系统。
这套货币是以反常的方式
建立起来的,所以货币的面值相当奇快——习惯上,一套货币的面值应该是由1,5,10,
20或25,50和100作为的单位组成才对,当然有时也会把2加入进来作为调剂。
奶牛想知道用一套货币表示一笔钱可以有多少种不同的方法。
比如说,对于{1,2,5,10,…}
这套货币系统,可以用来表示18元的方法有18×1,9×2,8×2+2×1,3×5+2+1,
等等。
给定一套货币的面值,写一个程序来计算有多少方法来表示某笔钱。
我们保证答案不会
超过带符号的longlong类型(C/C++)或Int64类型(FreePascal)。
输入格式
货币有V(1≤V≤25)种,需要构造的钱的数目是N(1≤N≤10000)
●第一行:
两个正整数:
V,N
●第二行至其余各行:
V个表示货币单位面值的整数(每行出现的整数个数是不定的)
输出格式
●第一行:
用V种货币表示N元钱的方法总数
样例
money.in
310
125
解题思路
money.out
10
原问题
子问题
边界条件
递推公式
目标函数
给定V种面值的钱币c1,c2,…,cV,求有多少种方案可以恰好表示N元
f[i,j]:
只使用前i种钱币,恰好可以表示出j元的方案总数
f0,0=1,f0,1=⋯=f0,N=0
fi,j=fi−1,j+fi,j−ci
f[V,N]
2009年暑假集训讲义
上海交通大学马融
奶牛博览会(CowExhibition,USACO2003Nov)
奶牛们想向社会证明其实他们是聪明而且风趣的。
为此,贝西筹备了一个专门展览奶牛
的博览会,她已经对N(1≤N≤100)头奶牛进行了面试,确定了每头奶牛的聪明指数
Si(−1000≤Si≤1000)和风趣指数Fi(−1000≤Fi≤1000)。
贝西需要决定让哪些奶牛上博览会。
设总聪明指数TS为各奶牛聪明指数Si的和,总风趣
指数TF为各奶牛风趣指数Fi的和。
贝西想使TS与TF的和最大,同时她希望这两个值不要小
于零(