USACO上面的动态规划题目
背包问题 usaco

背包问题译 by 铭(在中国,背包问题一般是这样描述的:设n个重量为(W1,W2,...Wn)的物品和一个载重为S的背包,将物品的一部分xi放进背包中的利润是Pixi,问如何选择物品的种类和数量,使得背包装满而获得最大的利润?另有一简化版本说:设有一个背包可以放入的物品重量为S,现有n件物品,重量分别为W1,W2,...Wn。
问能否从这n件物品中选择若干件放入此背包,使得放入的重量之和正好为S。
--译者加,不知道有没有班门弄斧之嫌)前提●贪心法(它是一种多步决策法,它总是作出在当前看来是最好的选择,它的考虑不是从整体出发,而只是某种意义上的局部最优,这样贪心法不能对所有问题达到整体最优解,但是对相当范围的许多问题都能够产生整体最优解。
--译者)●动态规划(它是将问题进行逐步的划分来缩小问题的规模,直到可以求出子问题的解为止。
分划子问题后,对应的子问题中含有大量的重复,这样就将重复地求解;在第一次遇到重复时把它解决,并将解保存起来,以备后面引用。
动态规划法常用来求一个问题在某种意义下的最优解。
--译者)●递归下降示例问题:用录音带录音农场主约翰最喜欢的爱好是制作一个Bessie喜欢的音乐合集磁带以便它在产奶时听。
Bessie的产奶量取决于它产奶时所听的歌曲。
已知一组歌曲(每首歌都由一对整数--此曲的长度(以秒计),听该首歌时的产奶量来表示)以及给挤奶的总时间。
找到这样一组歌曲的集合,使得歌曲的总长度不超过给Bessie挤奶的总时间且使Bessie的产奶量达到最大。
抽象描述已知一组物品--每个都有其尺寸和值(比如,重量),以及可用的总空间。
找到这样一个集合,使得该集合的值的和最大,且其尺寸的和受某些限制所约束。
集合中任何一个特定的项目的总数目/尺寸不能超过它的可利用率。
解题想法视其为背包问题的一般方法是一个容量受限的背包使得放入其中的物品的值达到最大。
以上述问题为例,Bessie产奶时听的音乐带就是“背包”,而那些歌就是“放入背包中的物品”。
USACO DP动规 完整版

Wizard1.单调队列优化①土地并购(Land Acquisition,2008Mar)②干草塔(Tower of Hay,2009Open)③又买饲料(Buying Feed,2010Nov)④玉米实验(Cornfields,2003Mar)⑤修剪草坪(Mowing the Lawn,2011Open)2.树型①焊接(Soldering,2011Open)②产奶比赛(Milk Team Select,2006Mar)③道路重建(Rebuilding Roads,Feb2002)④手机网络(Cell Phone Network,2008Jan)3.背包问题续①电子游戏(Video Game Troubles,2009Dec)②最少找零(The Fewest Coins,2006Dec)③三个代表(Jersey Politics,2005Feb)④录制唱片(Raucous Rockers,1996Qualifying Round)4.背包问题①股票市场(Stock Market,2009Feb)②奶牛会展(Cow Exhibition,2003Fall)③太空电梯(Space Elevator,2005Mar)④平分子集(Subset Sums,1998Spring)5.区间型①提交作业(Turning in Homework,2004Open)②抢鲜草(Grazing on the Run,2005Nov)③最优回文(Cheapest Palindrome,2007Open)④智取金币(Treasure Chest,2010Dec)6.其他一①打扫食槽(Cleaning Up,2009Mar)②奶牛自行车队(Cow Cycling,Feb2002)③滑雪缆车(Ski Lift,2006Mar)④奶牛飞盘队(Cow Frisbee Team,2009Mar)7.其他二①滑雪比赛(Bobsledding,2009Dec)②滑雪课程(Ski Lessons,2009Open)③方形牛棚(Big Barn,1997Fall)④接住苹果(Apple Catching,2004Nov)⑤公司利润(Profits,2011Jan)土地并购(Land Acquisition,2008Mar)首先我们按长与宽都递减の排序,如果有一个矩形长宽都不如另一个矩形,那么可以忽略它。
0-1背包问题

• 因为本题的目标是求解储蓄罐内可以达到的最小金 额,所以初始化时所有dp都为INF(无穷大),且 dp[0]=0。(如果要求解储蓄罐内可以达到的最大金 额,那么应该初始化为-1)。本题的解为dp[n][m], 如果dp[n][m]为INF,则说明m克是一个不可达的状 态。
• 本题dp数组一维,下标为硬币重量。
SPACE ELEVATOR
• 试题来源:USACO 2005 March Gold • 在线测试:POJ 2392
• 奶牛们要上太空了!它们计划建造一座太空电梯作 为它们登上太空的轨道:电梯是一个巨大的、由块 组成的塔,有K(1K400)种不同类型的块用于建 造塔。类型i的块的高度为hi(1hi100),块的数量 为ci(1ci10)。由于宇宙射线可能造成的损害,在 塔中,由类型i的块组成的部分不能超过最大高度ai (1ai40000)。
• 由于本题的数据范围较大,而long long可以存 储19位,因此,将超过19位的部分称为高位部 分(如果存在),19位以内的部分称为低位部 分。设两个long long类型的变量dp1[ ]和dp2[ ], 其中dp1[ ]存储高位部分,dp2[ ]存储低位部分。 这样,就可以按照题目要求的数据规模存储和 输出方式数了。
多重背包
• 多重背包问题描述如下:给定n种物品和一个 载荷能力为M的背包,物品i重量为wi,数量为 numi , 价 值 为 pi , 其 中 wi>0 , pi>0 , numi>0 , 1in;求解将哪些物品装入背包,可使得使 背包里所放物品的总重量不超过M,且背包中 物品的价值总和达到最大。
USACO试题精选(第一辑)

USACO试题精选第一辑第1题利润(Profits, USACO 2011 Jan) (3)第2题购买饲料二(Buying Feed II, USACO 2010 Jan) (4)第3题奶牛杂技(Cow Acrobats, USACO 2006 Nov) (5)第4题抓苹果(Apple Catching, USACO 2004 Nov) (6)第5题抢购干草(Hay For Sale, USACO 2008 Dec) (7)第6题建造栅栏(Building A Fence, USACO 2008 Oct) (8)第7题建造道路(Building Roads, USACO 2007 Dec) (9)第8题青铜莲花池(Bronze Lilypad Pond, USACO 2007 Feb) (10)第9题滑雪课程(Ski Lessons, USACO 2009 Open) (11)第10题奶牛飞盘队(Cow Frisbee Team, USACO 2009 Mar) (12)第11题奶牛博览会(Cow Exhibition, USACO 2003 Fall) (13)第12题最近回文(Cheapest Palindrome, USACO 2007 Open) (14)第13题安慰奶牛(Cheering up the Cows, USACO 2008 Nov) (15)第14题玉米迷宫(Corn Maze, USACO 2011 Open) (16)第15题奶牛集会(MooFest, USACO 2004 Open) (17)第16题奶牛文字(Cowlphabet, USACO 2011 Feb) (18)第17题奶牛跨栏(Cow Hurdles, USACO 2007 Nov) (19)第18题工作安排(Work Scheduling, USACO 2009 Open) (20)第19题手机网络(Cell Phone Network, USACO 2008 Jan) (21)第20题提交作业(Turning in Homework, USACO 2004 Open) (22)第21题滑雪缆车(Ski Lift, USACO 2006 Mar) (23)第22题派发巧克力(Chocolate Giving, USACO 2010 Feb) (24)第23题赞助学费(Financial Aid, USACO 2004 Mar) (25)第24题白银莲花池(Silver Lilypad Pond, USACO 2007 Feb) (26)第25题地震(Earthquake, USACO 2001 Open) (27)第26题股票市场(Stock Market, USACO 2009 Feb) (28)第27题奶牛赛车(Cow Cycling, USACO Feb 2002) (29)第28题奶牛观光(Sightseeing Cows, USACO 2007 Dec) (30)第29题道路重建(Rebuilding Roads, USACO Feb 2002) (31)第30题奶牛接力(Cow Relays, USACO 2007 Nov) (32)第31题猜数游戏(Haybale Guessing, USACO 2008 Jan) (33)第32题混乱奶牛(Mixed Up Cows, USACO 2008 Nov) (34)第33题修剪草坪(Mowing the Lawn, USACO 2011 Open) (35)第34题道路翻新(Revamping Trails, USACO 2009 Feb) (36)第35题安排牧场(Corn Fields, USACO 2006 Nov) (37)第36题叠积木(Cube Stacking, USACO 2004 Open) (38)第37题奶牛抗议(Generic Cow Protests, USACO 2011 Feb) (39)第38题洞穴奶牛第一话(Cave Cow 1, USACO 2004 Open) (40)第39题打扫食槽(Cleaning Up, USACO 2009 Mar) (41)第40题购买饲料(Buying Feed, USACO 2010 Nov) (42)第41题土地并购(Land Acquisition, USACO 2008 Mar) (43)第42题干草塔(Tower of Hay, USACO 2009 Open) (44)第43题明星奶牛(Popular Cows, USACO 2003 Fall) (45)第44题电子游戏(Video Game Troubles, USACO 2009 Dec) (46)第45题产奶比赛(Milk Team Select, USACO 2006 Mar) (47)第46题黄金莲花池(Lilypad Pond, USACO 2007 Feb) (48)第47题逢低吸纳(BUY LOW, BUY LOWER, USACO Feb 2002) (49)第48题焊接(Soldering, USACO 2011 Open) (50)第49题旅馆(Hotel, USACO 2008 Feb) (51)第50题道路和航线(Roads and Planes, USACO 2011 Jan) (52)这一辑从USACO月赛中选择了质量很高的50题,是用来训练算法设计和实现的极好素材,如果初学者希望掌握比较扎实的基本功,我建议将这一辑的题目好好研究一下。
usaco 试题 2024

usaco 试题 2024usaco的试题一直都是很有挑战性的,2024年的也不例外。
我一看到这些试题啊,就感觉像是面对着一群调皮的小怪兽,得一个一个去征服它们。
咱先说说试题的类型吧。
有那种特别考验算法思维的题目,就像是走迷宫一样,你得在错综复杂的算法路径里找到最正确的那一条。
比如说,有一道题是关于农场里动物的分布和资源分配的,你得用合适的算法去计算怎么安排这些动物,才能让农场的效益最大化。
这就好比你是农场主,要精打细算,可不能让那些小动物们饿着,同时还得让农场赚钱,是不是超级有趣又很烧脑呢?还有一些试题是和数据结构息息相关的。
数据结构就像是盖房子的砖头和架构,你得把它们搭得稳稳当当的。
2024年的试题里有涉及到如何高效地存储和检索农场里的各种信息,像是动物的种类、数量,还有农作物的产量之类的。
这时候,你要是对数据结构理解得不够透彻,那可就像盖房子少了几块关键的砖头,很容易就垮掉啦。
再讲讲解题的过程吧。
这就像是一场冒险之旅。
有时候你觉得自己已经找到了正确的方向,一路兴奋地跑过去,结果发现是个死胡同。
我在做一道关于动物迁徙路线规划的题目时,一开始我想了个很简单的算法,觉得肯定能行。
结果呢,一运行,全错了。
当时那个心情啊,就像一盆冷水浇下来,但是咱不能放弃呀。
我就重新开始分析题目,画了好多草图,把动物可能的迁徙路径都画出来,然后再一点点调整算法。
这个过程真的很磨人,但是当最后得出正确答案的时候,那种成就感简直无法形容,就像是在黑暗里摸索了好久,突然看到了一道明亮的光。
而且啊,在做这些试题的过程中,我还发现了自己很多知识的漏洞。
以前觉得自己算法学得还不错,数据结构也掌握得挺好,可是一遇到这些试题,就发现其实还有很多可以提高的地方。
这也提醒我们,不管什么时候都不能骄傲自满,要不断学习。
就像我们在学校里学习其他课程一样,编程也是一个需要不断积累的过程。
每一道usaco试题都是一次检验自己的机会,也是一次让自己变得更强大的机会。
【题解】bzoj1597:[Usaco2008Mar]土地购买(动态规划+斜率优化)
![【题解】bzoj1597:[Usaco2008Mar]土地购买(动态规划+斜率优化)](https://img.taocdn.com/s3/m/376b251c854769eae009581b6bd97f192279bf99.png)
【题解】bzoj1597:[Usaco2008Mar]⼟地购买(动态规划+斜率优化)Solution:线性DP打牌\(+\)斜率优化定义状态:\(dp[i]\)到了位置\(i\)最少花费⾸先我们要发现,如果有⼀个⼩⽅块能被其他的⼤⽅块包围,其实可以忽略这个⼩⽅块,因为我们可以把他们俩捆绑,⼩⽅块的边长不会对求值造成贡献然后我们可以按照宽从⼤到⼩排序,长从⼩到⼤(剔除了那种包含的情况),保证单调性我们就可以列出递推式⼦:\(dp[i]=min(dp[j-1]+y[j]*x[i])\)注意是\(dp[j-1]\)(这⾥搞错了好久)显然这个是满⾜决策单调性的嘛(主要是我不会证明)然后我们就可玩弄这个式⼦,假定\(j<k\),那么\(y[j]>y[k]\),\(dp[j-1]<dp[k-1]\),且\(x[i]\)单调增\[dp[j-1]+y[j]*x[i]>dp[k-1]+y[k]*x[i] \]\[dp[j-1]-dp[k-1]>-(y[j]-y[k])*x[i] \]\[\frac{dp[j-1]-dp[k-1]}{y[j]-y[k]}>-x[i] \]然后维护⼀个上凸包就ok了Code://It is coded by Ning_Mew on 5.22#include<bits/stdc++.h>#define LL long longusing namespace std;const int maxn=5e5+7;int n;struct Node{LL x,y;}node[maxn];LL dp[maxn],large=-10000;int team[maxn],s=0,t=1;LL Min(LL a,LL b){return a<b?a:b;}bool cmp(const Node &a,const Node &b){if(a.y!=b.y)return a.y>b.y;return a.x>b.x;}double slope(int i,int j){return 1.0*(dp[i-1]-dp[j-1])/(node[i].y-node[j].y);}int main(){freopen("in.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld%lld",&node[i].x,&node[i].y);}sort(node+1,node+n+1,cmp);s=1;t=2;team[s]=1;dp[1]=node[1].x*node[1].y;large=node[1].x;for(int i=2;i<=n;i++){if(node[i].x<=large){dp[i]=dp[i-1];continue;}large=max(large,node[i].x);while((s+1<t)&&(slope(team[s],team[s+1])>-1.0*node[i].x)){s++;}dp[i]=Min(node[i].x*node[i].y+dp[i-1],dp[ team[s]-1 ]+node[ team[s] ].y*node[i].x);while((s+1<t)&&(slope(team[t-1],i)>slope(team[t-2],team[t-1]))){t--;}team[t]=i;t++;}printf("%lld\n",dp[n]);return 0;}。
usaco2023 12月银组题解

【usaco2023 12月银组题解】一、题目概况1.1 题目背景12月份的usaco银级比赛是每年一度的重要赛事,题目难度适中,涵盖了很多经典算法和数据结构的应用。
1.2 题目数量本次比赛共包含5道题目,涉及动态规划、贪心算法、图论等多个领域。
二、题目详解2.1 第一题 - 最小差值本题要求给定一个包含n个正整数的数组,求该数组中两个元素的最小差值。
2.1.1 解题思路我们可以先对数组进行排序,然后遍历数组中相邻的两个元素,计算它们之间的差值,并更新最小差值。
2.1.2 代码实现```c++int minDiff(vector<int> nums) {sort(nums.begin(), nums.end());int minDiff = INT_MAX;for (int i = 1; i < nums.size(); i++) {minDiff = min(minDiff, nums[i] - nums[i-1]);}return minDiff;}```2.2 第二题 - 运动员配对本题要求给定一个包含n个正整数的数组,表示n个运动员的实力值,要求找出一种最优的配对方案,使得每对运动员的实力差值最小。
2.2.1 解题思路我们可以先对数组进行排序,然后使用双指针法找出实力差值最小的配对方案。
2.2.2 代码实现```c++int minP本人ring(vector<int> strength) {sort(strength.begin(), strength.end());int minDiff = INT_MAX;int l = 0, r = strength.size()-1;while (l < r) {minDiff = min(minDiff, strength[r] - strength[l]);l++;r--;}return minDiff;}```2.3 第三题 - 最小生成树本题给定一个无向连通图,要求求出该图的最小生成树的权值之和。
USACO题解(NOCOW整理版)

U S A C O题解(N O C O W整理版)-CAL-FENGHAI.-(YICAI)-Company One1USACO 题解Chapter1Section 1.1Your Ride Is Here (ride)这大概是一个容易的问题,一个“ad hoc”问题,不需要特殊的算法和技巧。
Greedy Gift Givers (gift1)这道题的难度相当于联赛第一题。
用数组incom、outcom记录每个人的收入和支出,记录每个人的名字,对于送礼人i,找到他要送给的人j,inc(incom[j],outcom[i] div n),其中n是要送的人数,最后inc(incom[i],outcom[i] mod n),最后输出incom[i]-outcom[i]即可。
(复杂度O(n^3))。
用Hash表可以进行优化,降复杂度为O(n^2)。
Friday the Thirteenth (friday)按月为单位计算,模拟运算,1900年1月13日是星期六(代号1),下个月的13日就是代号(1+31-1) mod 7+1的星期。
因为数据小,所以不会超时。
当数据比较大时,可以以年为单位计算,每年为365天,mod 7的余数是1,就是说每过一年所有的日和星期错一天,闰年第1、2月错1天,3月以后错2天。
这样,只要先求出第一年的解,错位添加到以后的年即可。
详细分析:因为1900.1.1是星期一,所以1900.1.13就等于(13-1) mod7+1=星期六。
这样讲可能不太清楚。
那么,我来解释一下:每过7天是一个星期。
n 天后是星期几怎么算呢?现在假设n是7的倍数,如果n为14,那么刚好就过了两个星期,所以14天后仍然是星期一。
但如果是过了15天,那么推算就得到是星期二。
这样,我们就可以推导出一个公式来计算。
(n天 mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号。
当括号内的值为7的倍数时,其代号就为0,那么,此时就应该是星期日这样,我们可以得出题目的算法:int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}int b[8]={0}a数组保存一年12个月的天数(因为C语言中数组起始下标为0,所以这里定义为13)。
USACO(00-04)试题

2000-2004年USACO竞赛试题上海交通大学马融2004 Nov (2)抓苹果(Apple Catching, USACO 2004 Nov) (3)2004 Open (4)堆叠积木(Cube Stacking, USACO 2004 Open) (5)哞哞集会(MooFest, USACO 2004 Open) (6)提交作业(Turning in Homework, USACO 2004 Open) (7)溶洞奶牛第四话(Cave Cow 4, USACO 2004 Open) (9)2004 Mar (10)校队选拔(Moo University - Team Tryouts, USACO 2004 Mar) (11)披萨预定(Moo University - Emergency Pizza Order, USACO 2004 Mar) (13)财政援助(Moo University - Financial Aid, USACO 2004 Mar) (14)2004 Feb (15)导航噩梦(Navigation Nightmare, USACO 2004 Feb) (16)奶牛马拉松(Cow Marathon, USACO 2004 Feb) (18)距离查询(Distance Queries, USACO 2004 Feb) (19)距离统计(Distance Statistics, USACO 2004 Feb) (21)2003 Fall (22)奶牛博览会(Cow Exhibition, USACO 2003 Fall) (23)挤奶网格(Milking Grid, USACO 2003 Fall) (24)明星奶牛(Popular Cows, USACO 2003 Fall) (27)选美大会(Beauty Contest, USACO 2003 Fall) (28)2002 Feb (29)低价买进(BUY LOW, BUY LOWER, USACO Feb 2002) (30)奶牛赛车(Cow Cycling, USACO Feb 2002) (31)道路重建(Rebuilding Roads, USACO Feb 2002) (32)2001 Open (34)地震(Earthquake, USACO 2001 Open) (35)2004 Nov抓苹果(Apple Catching, USACO 2004 Nov)奶牛喜欢吃苹果。
22年美赛C题动态规划

22年美赛C题动态规划背景:能源生产和使用是任何经济的重要组成部分。
在美国,能源政策的许多方面都分散下放到州的水平。
此外,不同州的地理区域和工业影响能源的使用和生产。
在1970年,12个在美国西方的州形成西部州际能源协议(WIEC),其任务重点是促进这些州之间的合作,促进发展和核能技术管理。
州际契约是一种在两个或多个州之间的契约安排。
在这些州就具体的政策问题达成一致意见,就某一特定的区域或州事项采取一套标准或相互合作。
问题:在美国与墨西哥的边境,有四个州—美国加利福尼亚州(CA),亚利桑那州(AZ),美国新墨西哥州(NM)和得克萨斯州(TX),这是希望到形成一个关注增加使用清洁、可再生能源的来源的实际的新能源契约。
你的团队需要帮助这四个州的州长对这些数据进行分析和建模,然后通知他们制定一系列发展他们的州际能源契约的目标。
该附件数据文件“Problem CD Ate.XL”提供的第一个工作簿是50年中四个州的能源生产和消费数据的605个变量,伴随一些人口和经济信息。
在这个数据集中,605个变量的名称被定义在第二工作簿中。
第一部分1、使用所提供的数据,为这四个州分别创建一个能量概况。
2、建立一个模型来描述从1960到2009年这四个州的能量是如何演化的。
分析和解释模型的结果,以解决四个州使用清洁和可再生能源的问题,用州长们很容易理解的方式,帮助他们了解四个州之间的异同。
你的讨论包括可能影响异同的的因素3、确定在2009年这四个州中哪一个州有“最佳”使用清洁和可再生能源的概况。
解释你的标准和选择。
4、基于这些州使用能源的历史演变,以及你对所建立的州概况之间差异的理解,如你所定义的那样,在每个州长办公室没有任何政策改变的情况下,分别预测2025和2050年每个州的能源概况。
第二部分1、基于你对这四个州的比较,用你的“最佳”概况的标准和你的预测,来确定2025和2050年的可再生能源使用的目标,并将它们作为新的四州能量契约的目标。
usaco2020dec第五题

usaco2020dec第五题分析【题目描述】usaco2020dec第五题是一个关于排列组合和数学递推的题目。
在本题中,给定一个整数n,要求求解一个长度为n的排列p,并且要求满足以下条件:1. 任意两个相邻的数字i和j,满足$p[i] \leq p[j]$ and $p[j] \leq p[i]+k$,其中k为给定的整数。
2. 满足第一条条件的排列个数对10^9+7取模的结果。
【题目分析】这是一个典型的数学递推题目,在解题过程中,可以通过观察和推导得到一些规律,从而得到排列的个数。
【解题思路】1. 通过观察和举例分析可以发现,设f(i, j)为以第i个数字结尾,长度为j的合法排列数,则f(i, j) = f(i-1, j-1) + f(i, j-1) + ... + f(i-k, j-1),其中k为给定的整数。
2. 利用该递推式,可以逐步求解出以不同数字结尾的长度为j的合法排列数,最后将它们相加即可得到整个排列的个数。
3. 在求解过程中,需要注意处理边界条件和特殊情况。
【代码实现】```c++#include <iostream>#include <vector>using namespace std;const int MOD = 1e9+7;int m本人n() {int n, k;cin >> n >> k;vector<vector<int>> dp(n+1, vector<int>(n+1, 0)); dp[0][0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = (dp[i-1][j-1] + dp[i][j-1])MOD;if (i-k-1 >= 0) {dp[i][j] = (MOD + dp[i][j] - dp[i-k-1][j-1])MOD; }}}int ans = 0;for (int i = 1; i <= n; i++) {ans = (ans + dp[n][i])MOD;}cout << ans << endl;return 0;}```【总结】usaco2020dec第五题是一道典型的排列组合和数学递推题目,通过观察和分析递推规律,可以得到解题思路并实现代码。
USACO心得

rectbarn 是第6章的题目,的确很难。它与 bigbrn 唯一的不同是这题中要求寻找的是面积最大的全为0的矩形,这导致 bigbrn 的方法完全无法应用,但我们可以从另一个角度设计状态转移方程。设h[i][j]表示以s[i][j]为下端点可向上扩展的最大全为0的线段高度,l[i][j]表示此线段可向左扩展的最大宽度,r[i][j]表示此线段可向右扩展的最大宽度,则以s[i][j]为底边上一点,先向上再向左右能扩展出的最大的矩形可以由以上三个值轻松求得。s[i][j]==0时,有h[i][j]=h[i-1][j]+1,l[i][j]=min{l[i-1][j] , lmax[i][j]},r[i][j]=min{r[i-1][j] , rmax[i][j]};其中lmax[i][j]和rmax[i][j]分别是s[i][j]可向左右扩展出的最长全0线段宽度。s[i][j]==1时,h[i][j]=0,l[i][j]=r[i][j]=∞。由于h[i][j]、l[i][j]、r[i][j]等只是对h[i-1][j]、l[i-1][j]、r[i-1][j]更新而求出,所以我们也只需要将它们保存为1维数组。另外,为了有效地随时求解lmax[i][j]、rmax[i][j],也为了不超空间,我们也不应将整个矩阵保存成s[i][j]这样的二维数组的形式,而是应该对每一行的1所在的位置建一张有序的表,进行离散化的处理。递推时保存当前点的最左边的1在表中的下标,以便顺利求解。 buylow 的第一问是经典的最长下降子序列问题,其状态转移方程为:f[i]=max{f[j]}+1 (j<i , s[j]<s[i]),f[i]表示以s[i]结尾的最长下降子序列的最大长度,其中第二个小于号若改变成大于、小于等于、大于等于就可以求出最长上升子序列、最长不上升子序列、最长不下降子序列。第二问是问不重复的最长下降子序列的个数。如果给定的序列中不包含重复的数字,那么我们可以轻易地想到这样的状态转移方程:n[i]=sum{s[j]} (j<i , s[j]<s[i], f[j]+1==f[i])。但当原序列包含重复的数字时,上述求解方法会对一些相同的子序列需重复计算,尽管子序列中数字在原序列的位置可能并不相同。我将上述方程修改成了这样:n[i]=sum{s[j]}–n[k] (j<i , s[j]<s[i], f[j]+1==f[i] ),其中 k为满足k<i且f[k]==f[i]、s[k]==s[i]的最大的k,这样就减去了可能重复统计的子序列。最后,由于结果可能很大,数组n的元素应该是高精度数。实现的一个技巧是在s序列的最后添上一个比序列的所有数都要小的数(本题中0就可以),这样可以简化编程。
usaco题目集

usaco题目集摘要:ACO简介ACO竞赛题型及难度3.备赛策略与技巧4.提高编程能力的实用建议5.总结正文:USACO(USA Computing奥赛)是美国一项面向中学生的计算机编程竞赛,旨在选拔和培养优秀的计算机科学人才。
参赛选手需要在规定时间内完成一系列编程题目,根据算法复杂度和代码质量获得积分,最终晋级更高级别的比赛。
以下是关于USACO的一些详细信息,以及如何备赛和提高编程能力的实用建议。
ACO简介USACO竞赛分为四个等级:铜牌、银牌、金牌和白金牌。
竞赛题目涵盖多种题型,如排序、搜索、图论、动态规划等,难度逐渐递增。
参赛选手需要在4-5小时内完成3-4道题目,每道题目有不同分数,满分约为400分。
竞赛语言包括C、C++、Java和Python等。
ACO竞赛题型及难度USACO题目分为以下几类:(1)排序:如快速排序、归并排序等;(2)搜索:如广度优先搜索、深度优先搜索等;(3)图论:如最短路径、最小生成树等;(4)动态规划:如背包问题、最长公共子序列等;(5)算法优化:如大整数运算、矩阵快速幂等;(6)其他:如计算几何、字符串处理等。
随着等级的提升,题目的难度和复杂度也会增加,例如金牌题目可能涉及到更多高级算法和数据结构。
3.备赛策略与技巧(1)熟悉竞赛环境:提前了解竞赛使用的编程语言、在线评测系统和题目格式,熟悉提交、测试、结果反馈等流程;(2)学习经典算法和数据结构:掌握常见的排序、搜索、图论等算法,了解各种算法的时间复杂度和空间复杂度;(3)练习代码风格:遵循清晰的代码风格,便于阅读和调试,避免因格式问题导致扣分;(4)模拟与优化:针对题目进行多次模拟和测试,优化算法和数据结构,提高代码性能;(5)学会搜索与借鉴:在遇到难题时,学会利用搜索引擎和参考资料寻找思路和方法;(6)参加训练与交流:加入线上或线下的编程训练班和讨论小组,与他人共同学习和进步。
4.提高编程能力的实用建议(1)多练习:编程能力的提高离不开大量的练习,通过解决实际问题和编写小型项目,不断提高自己的编程水平;(2)学习算法与数据结构:掌握经典算法和数据结构,提高解决问题的效率;(3)阅读优秀代码:学习他人的优秀代码,吸收经验,提升自己的编程素养;(4)参加编程竞赛:参加各类编程竞赛,锻炼自己的竞赛技巧和心理素质;(5)关注前沿技术:关注计算机科学领域的前沿技术和热点问题,拓宽知识面。
USACO月赛题解

USACO2002-2008月赛解题报告USACO 2002 February题目名称题目描述算法Fiber CommunicationsN个人围成一个环,有M对人想要联系,但每次只能连接相邻两个人。
问要满足这M对关系最少要连接几条边。
枚举断开的地方,然后类似染色一样。
用并查集。
Power HungryCows初始时只有X和1,每次你能从现有的两个数中选两个(可以重复),通过乘或者除替换掉其中某个数。
问最少要操作几次能得到X^P。
相当于指数通过加减得到P。
BFS时如果大的那个数不超过50000,而且小的那个数不超过100就进行扩展,否则不扩展。
证明我不会……或者也可以IDA*。
Cow Cycling 有N头奶牛,他们需要跑D圈,刚开始每头奶牛的体力值都为E。
如果跑X圈,那么领跑的奶牛每分钟消耗的体力为X*X,后面的奶牛每分钟消耗的体力是X。
求跑完这D圈最少需要的时间。
F[i][j][k]表示前i-1头奶牛领跑完了,现在是第i头奶牛领跑,已经跑了j圈且奶牛i已经消耗了k的体力需要的最少时间。
F[i][j+x][k+x*x]=min(F[i][j ][k]+1)F[i+1][j][j]=min(F[i][j][k] )Rebuilding Roads有一棵树,你需要砍掉一些边得到一棵节点个数为P的子树。
问最少需要砍掉几条边。
F[i][j]表示以i为根的树,得到了一棵节点个数为j的子树需要砍掉的最少的边数。
Triangular Pastures有N条长度为Li的线段,你要用这些线段拼出一个三角形,使得这个三角形面积最大。
求最大面积。
F[i][j]表示其中一条边长为i,另一条边长为j是否可以达到,第三条边的长度就是总和减去(i+j)。
Chores 有N个任务,除了任务1以外的其他任务都有一些任务需要在这个任务之前完成。
求完成所有任务至少需要多少时间。
F[i]表示能完成任务i的最早时间。
F[i]=max(F[j])+t[i],任务j 需要在任务i之前完成。
usaco2023年12月题解

USACO(美国计算机奥林匹克竞赛)是世界各地优秀学生参与的一项重要竞赛,该比赛旨在促进在编程和算法方面的学习和挑战。
每年举办四次比赛,涉及四个级别(铜、银、金、铂金),各级别考试内容逐渐增加难度。
作为一项国际性的编程比赛,USACO的考试题目一直备受关注。
现在就让我们来看一下xxxUSACO的题目及解析。
1. 题目一:最大子数组和本题要求求给定整数数组中的最大子数组和。
解析:这是一道比较基础的动态规划题目。
我们可以使用动态规划算法来求解该问题。
首先我们定义一个数组dp,dp[i]表示当前位置i的最大子数组和。
然后我们可以根据动态规划的状态转移方程来进行求解。
2. 题目二:互不相交子数组给定一个长度为n的数组,求其最大的互不相交子数组之和。
解析:这是一道比较典型的贪心算法题目。
我们可以使用贪心算法来求解该问题。
首先我们定义一个数组dp,dp[i][0]表示以位置i结尾的最大互不相交子数组和,dp[i][1]表示以位置i结尾的不包括位置i的最大互不相交子数组和。
然后我们可以根据贪心算法的策略来进行求解。
3. 题目三:单词搜索给定一个m×n的字符矩阵和一个单词,判断该单词是否存在于字符矩阵中。
解析:这是一道比较典型的回溯算法题目。
我们可以使用回溯算法来求解该问题。
首先我们定义一个vis数组,vis[i][j]表示字符矩阵中位置(i, j)是否已经被访问过。
然后我们可以根据回溯算法的策略来进行求解。
4. 题目四:最长上升子序列给定一个整数数组,求其最长的上升子序列的长度。
解析:这是一道比较经典的动态规划题目。
我们可以使用动态规划算法来求解该问题。
首先我们定义一个数组dp,dp[i]表示以位置i结尾的最长上升子序列的长度。
然后我们可以根据动态规划的状态转移方程来进行求解。
通过以上题目及解析的分析,我们可以看出,USACO xxx的题目在编程和算法方面具有一定的挑战性,需要考生对动态规划、贪心算法、回溯算法等内容有一定的了解和掌握。
USACO上面的动态规划题目

水题6Barn Repair(Section 1.3)修理牛棚译by tim green在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。
好在许多牛正在度假,所以牛棚没有住满。
剩下的牛一个紧挨着另一个被排成一行来过夜。
有些牛棚里有牛,有些没有。
所有的牛棚有相同的宽度。
自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。
他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。
农民约翰想将他购买的木板总长度减到最少。
给出M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。
输出所需木板的最小总长度作为的答案。
PROGRAM NAME: barn1INPUT FORMATSAMPLE INPUT (file barn1.in)4 50 1834681415161721252627303140414243OUTPUT FORMAT单独的一行包含一个整数表示所需木板的最小总长度。
SAMPLE OUTPUT (file barn1.out)25[ 一种最优的安排是用板拦住牛棚3-8,14-21,25-31,40-43.]Number Triangles(Section 1.5)数字金字塔译by tim green考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
73 88 1 02 7 4 44 5 2 6 5在上面的样例中,从7 到3 到8 到7 到5 的路径产生了最大和:30 PROGRAM NAME: numtriINPUT FORMAT第一个行包含R(1<= R<=1000) ,表示行的数目。
动态规划动态转移方程大全

1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k])2. 资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);3. 线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1}4. 剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);5. 剖分问题2-----多边形剖分F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);6. 剖分问题3------乘积最大f[i,j]:=max(f[k,j-1]*mult[k,i]);7. 资源问题3-----系统可靠性(完全背包)F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}8. 贪心的动态规划1-----快餐问题F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}9. 贪心的动态规划2-----过河f=min{{f(i-k)} (not stone){f(i-k)}+1} (stone); +贪心压缩状态10. 剖分问题4-----多边形-讨论的动态规划F[i,j]:=max{正正f[I,k]*f[k+1,j];负负g[I,k]*f[k+1,j];正负g[I,k]*f[k+1,j];负正f[I,k]*g[k+1,j];} g为min11. 树型动态规划1-----加分二叉树(从两侧到根结点模型)F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}12. 树型动态规划2-----选课(多叉树转二叉树,自顶向下模型)F[I,j]表示以i为根节点选j门功课得到的最大学分f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}13. 计数问题1-----砝码称重f[f[0]+1]=f[j]+k*w[j];(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)14. 递推天地1------核电站问题f[-1]:=1; f[0]:=1;f:=2*f[i-1]-f[i-1-m]15. 递推天地2------数的划分f[i,j]:=f[i-j,j]+f[i-1,j-1];16. 最大子矩阵1-----一最大01子矩阵f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;ans:=maxvalue(f);17. 判定性问题1-----能否被4整除g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)18. 判定性问题2-----能否被k整除f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n20. 线型动态规划2-----方块消除游戏f[i,i-1,0]:=0f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),f[i,p,k+len[j]]+f[p+1,j-1,0]}ans:=f[1,m,0]21. 线型动态规划3-----最长公共子串,LCS问题f[i,j]={0(i=0)&(j=0);f[i-1,j-1]+1 (i>0,j>0,x=y[j]);max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);22. 最大子矩阵2-----最大带权01子矩阵O(n^2*m)枚举行的起始,压缩进数列,求最大字段和,遇0则清零23. 资源问题4-----装箱问题(判定性01背包)f[j]:=(f[j] or f[j-v]);24. 数字三角形1-----朴素の数字三角形f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);25. 数字三角形2-----晴天小猪历险记之Hill同一阶段上暴力动态规划if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]26. 双向动态规划1数字三角形3-----小胖办证f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])27. 数字三角形4-----过河卒//边界初始化f[i,j]:=f[i-1,j]+f[i,j-1];28. 数字三角形5-----朴素的打砖块f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);29. 数字三角形6-----优化的打砖块f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}30. 线性动态规划3-----打鼹鼠’f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])31. 树形动态规划3-----贪吃的九头龙32. 状态压缩动态规划1-----炮兵阵地Max(f[Q*(r+1)+k],g[j]+num[k])If (map and plan[k]=0) and((plan[P] or plan[q]) and plan[k]=0)33. 递推天地3-----情书抄写员f:=f[i-1]+k*f[i-2]34. 递推天地4-----错位排列f:=(i-1)(f[i-2]+f[i-1]);f[n]:=n*f[n-1]+(-1)^(n-2);35. 递推天地5-----直线分平面最大区域数f[n]:=f[n-1]+n:=n*(n+1) div 2 + 1;36. 递推天地6-----折线分平面最大区域数f[n]:=(n-1)(2*n-1)+2*n;37. 递推天地7-----封闭曲线分平面最大区域数f[n]:=f[n-1]+2*(n-1):=sqr(n)-n+2;38 递推天地8-----凸多边形分三角形方法数f[n]:=C(2*n-2,n-1) div n;对于k边形f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)39 递推天地9-----Catalan数列一般形式1,1,2,5,14,42,132f[n]:=C(2k,k) div (k+1);40 递推天地10-----彩灯布置排列组合中的环形染色问题f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);41 线性动态规划4-----找数线性扫描sum:=f+g[j];(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)42 线性动态规划5-----隐形的翅膀min:=min{abs(w/w[j]-gold)};if w/w[j]<gold then inc(i) else inc(j);43 剖分问题5-----最大奖励f:=max(f,f[j]+(sum[j]-sum)*i-t44 最短路1-----Floydf[i,j]:=max(f[i,j],f[i,k]+f[k,j]);ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];45 剖分问题6-----小H的小屋F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);46 计数问题2-----陨石的秘密(排列组合中的计数问题)Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);47 线性动态规划------合唱队形两次F:=max{f[j]+1}+枚举中央结点48 资源问题------明明的预算方案:加花的动态规划f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);49 资源问题-----化工场装箱员50 树形动态规划-----聚会的快乐f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);51 树形动态规划-----皇宫看守f[i,2]:=max(f[i,0],f[i,1]);f[i,1]:=sigma(f[t^.son,0]);f[i,0]:=sigma(f[t^.son,3]);52 递推天地-----盒子与球f[i,1]:=1;f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);53 双重动态规划-----有限的基因序列f:=min{f[j]+1}g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])54 最大子矩阵问题-----居住空间f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),min(f[i,j,k-1],f[i-1,j-1,k])),min(min(f[i-1,j,k-1],f[i,j-1,k-1]),f[i-1,j-1,k-1]))+1;55 线性动态规划------日程安排f:=max{f[j]}+P[I]; (e[j]<s)56 递推天地------组合数C[I,j]:=C[i-1,j]+C[I-1,j-1]C[I,0]:=157 树形动态规划-----有向树k中值问题F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}58 树形动态规划-----CTSC 2001选课F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)59 线性动态规划-----多重历史f[i,j]:=sigma{f[i-k,j-1]}(if checked)60 背包问题(+-1背包问题+回溯)-----CEOI1998 Substractf[i,j]:=f[i-1,j-a] or f[i-1,j+a]61 线性动态规划(字符串)-----NOI 2000 古城之谜f[i,1,1]:=min{f[i+length(s),2,1],f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+w ords[s]}62 线性动态规划-----最少单词个数f[i,j]:=max{f[I,j],f[u-1,j-1]+l}63 线型动态规划-----APIO2007 数据备份状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划f:=min(g[i-2]+s,f[i-1]);64 树形动态规划-----APIO2007 风铃f:=f[l]+f[r]+{1 (if c[l]<c[r])}g:=1(d[l]<>d[r]) 0(d[l]=d[r])g[l]=g[r]=1 then Halt;65 地图动态规划-----NOI 2005 adv19910F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];66 地图动态规划-----优化的NOI 2005 adv19910F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;67 目标动态规划-----CEOI98 subtraF[I,j]:=f[I-1,j+a] or f[i-1,j-a]68 目标动态规划----- Vijos 1037搭建双塔问题F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]69 树形动态规划-----有线电视网f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])leaves>=p>=l, 1<=q<=p;70 地图动态规划-----vijos某题F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);71 最大子矩阵问题-----最大字段和问题f:=max(f[i-1]+b,b); f[1]:=b[1]72 最大子矩阵问题-----最大子立方体问题枚举一组边i的起始,压缩进矩阵B[I,j]+=a[x,I,j]枚举另外一组边的其实,做最大子矩阵73 括号序列-----线型动态规划f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=”()”or(”[]”)),f[I+1,j+1]+1 (s[j]=”(”or”[” ] , f[I,j-1]+1(s[j]=”)”or”]” )74 棋盘切割-----线型动态规划f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]min{}}75 概率动态规划-----聪聪和可可(NOI2005)x:=p[p[i,j],j]f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1f[I,i]=0f[x,j]=176 概率动态规划-----血缘关系F[A, B]=(f[A0, B]+P[A1, B])/2f[I,i]=1f[I,j]=0(I,j无相同基因)77 线性动态规划-----决斗F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j78 线性动态规划-----舞蹈家F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])79 线性动态规划-----积木游戏F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])80 树形动态规划(双次记录)-----NOI2003 逃学的小孩朴素的话枚举节点i和离其最远的两个节点j,k O(n^2)每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。
usaco 易错题

usaco 易错题usaco的题目可真是让人又爱又恨呀,特别是那些易错题,就像一个个小陷阱,稍不注意就掉进去了。
一、算法类易错题。
说到算法方面的易错题,那可不少呢。
比如说动态规划的题目,有时候状态转移方程看起来很简单,但实际一写代码就发现问题多多。
就像有一道题是关于计算最长上升子序列的,乍一看,好像只要每次比较前面的数字,然后更新最长的长度就好了。
可是啊,这里面的细节很容易被忽略。
很多同学可能就只考虑了当前数字比前面某个数字大就直接加一,却忘了要去比较前面所有可能的情况,找到真正的最长上升子序列。
这就像是在迷宫里找路,你以为看到一条路就可以走到底,却不知道旁边可能还有更短或者更正确的路呢。
还有搜索算法的题目,像深度优先搜索(DFS)和广度优先搜索(BFS)。
有些易错题会在搜索的边界条件上做文章。
比如说有一道关于在图中搜索特定节点的题,很容易就把搜索的范围设置错了。
本来应该从某个节点的所有相邻节点开始搜索,结果可能只考虑了一部分相邻节点,这就导致答案不对啦。
就好比你要在一个大房子里找东西,结果只找了几个房间就说没有,其实东西就在其他没找的房间里呢。
二、数据结构类易错题。
数据结构相关的易错题也很有挑战性。
拿数组来说吧,数组越界的问题在usaco 的易错题里常常出现。
有时候在循环里操作数组,一不小心就会超出数组的范围。
这就像你要从一排盒子里拿东西,结果你伸手去拿的盒子根本不存在,那就肯定会出错啦。
再说说链表,链表的指针操作是个容易出错的点。
比如要删除链表中的某个节点,很多人会忘记正确地调整指针的指向。
就好像是火车的车厢连接,你要摘掉一节车厢,但是没有把前后车厢的连接弄好,那火车肯定就不能正常运行啦。
三、逻辑思维类易错题。
这一类的易错题真的是最考验人的啦。
有些题目需要你转好几个弯才能想明白。
比如说有一道题是关于农场里动物的数量关系的,给出了很多看似杂乱的条件,像牛比羊多几只,猪比牛少几只之类的。
要从这些条件里算出各种动物的具体数量,就需要非常清晰的逻辑思维。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
水题6Barn Repair(Section 1.3)修理牛棚译by tim green在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。
好在许多牛正在度假,所以牛棚没有住满。
剩下的牛一个紧挨着另一个被排成一行来过夜。
有些牛棚里有牛,有些没有。
所有的牛棚有相同的宽度。
自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。
他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。
农民约翰想将他购买的木板总长度减到最少。
给出M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。
输出所需木板的最小总长度作为的答案。
PROGRAM NAME: barn1INPUT FORMATSAMPLE INPUT (file barn1.in)4 50 1834681415161721252627303140414243OUTPUT FORMAT单独的一行包含一个整数表示所需木板的最小总长度。
SAMPLE OUTPUT (file barn1.out)25[ 一种最优的安排是用板拦住牛棚3-8,14-21,25-31,40-43.]Number Triangles(Section 1.5)数字金字塔译by tim green考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
73 88 1 02 7 4 44 5 2 6 5在上面的样例中,从7 到3 到8 到7 到5 的路径产生了最大和:30 PROGRAM NAME: numtriINPUT FORMAT第一个行包含R(1<= R<=1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
SAMPLE INPUT (file numtri.in)573 88 1 02 7 4 44 5 2 6 5OUTPUT FORMAT单独的一行包含那个可能得到的最大的和。
SAMPLE OUTPUT (file numtri.out)30Subset Sums(Section 2.2)集合对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:•{3} and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:•{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}•{2,5,7} and {1,3,4,6}•{3,4,7} and {1,2,5,6}•{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。
程序不能预存结果直接输出。
PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。
SAMPLE OUTPUT (file subset.out)4Longest Prefix(Section 2.3)最长前缀IOI'96译by Felicia Crazy在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。
生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。
如果一个集合P 中的元素可以通过串联(允许重复;串联,相当于Pascal 中的“+” 运算符)组成一个序列S ,那么我们认为序列S 可以分解为P 中的元素。
并不是所有的元素都必须出现。
举个例子,序列ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列S 的前面K 个字符称作S 中长度为K 的前缀。
设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。
PROGRAM NAME: prefixINPUT FORMAT输入数据的开头包括1..200 个元素(长度为1..10 )组成的集合,用连续的以空格分开的字符串表示。
字母全部是大写,数据可能不止一行。
元素集合结束的标志是一个只包含一个“.” 的行。
集合中的元素没有重复。
接着是大写字母序列S ,长度为1..200,000 ,用一行或者多行的字符串来表示,每行不超过76 个字符。
换行符并不是序列S 的一部分。
SAMPLE INPUT (file prefix.in)A AB BA CA BBCABABACABAABCOUTPUT FORMAT只有一行,输出一个整数,表示S 能够分解成P 中元素的最长前缀的长度。
SAMPLE OUTPUT (file prefix.out)11Cow Pedigrees(Section 2.3)奶牛家谱Silviu Ganceanu -- 2003译yangzhe1990农民约翰准备购买一群新奶牛。
在这个新的奶牛群中, 每一个母亲奶牛都生两小奶牛。
这些奶牛间的关系可以用二叉树来表示。
这些二叉树总共有N个节点(3 <= N < 200)。
这些二叉树有如下性质:1.每一个节点的度是0或2。
度是这个节点的孩子的数目。
2.树的高度等于K(1 < K < 100)。
高度是从根到任何叶子的最长的路径上的节点的数目; 叶子是指没有孩子的节点。
有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。
输出可能的家谱树的个数除以9901的余数。
PROGRAM NAME: nocowsINPUT FORMAT第1行: 两个空格分开的整数, N和K。
SAMPLE INPUT (file nocows.in)5 3OUTPUT FORMAT第 1 行: 一个整数,表示可能的家谱树的个数除以9901的余数。
SAMPLE OUTPUT (file nocows.out)2OUTPUT DETAILS:有5个节点,高为3的两个不同的家谱:@ @/ \ / \@ @ 和@ @/ \ / \@ @ @ @Money Systems(Section 2.3)货币系统译by timgreen母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。
[In their own rebellious way],,他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20 或25,50, 和100的单位面值组成的。
母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。
举例来说, 使用一个货币系统{1,2,5,10,...}产生18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它。
写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。
保证总数将会适合long long (C/C++) 和Int64 (Free Pascal)。
PROGRAM NAME: moneyINPUT FORMAT货币系统中货币的种类数目是V 。
(1<= V<=25)要构造的数量钱是N 。
(1<= N<=10,000)SAMPLE INPUT (file money.in)3 101 2 5OUTPUT FORMAT单独的一行包含那个可能的构造的方案数。
SAMPLE OUTPUT (file money.out)10Score Inflation(Section 3.1)总分译by timgreen学生在我们USACO的竞赛中的得分越多我们越高兴。
我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。
我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。
你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。
输入包括竞赛的时间,M(1 <= M <= 10,000)(不要担心,你要到了训练营中才会有长时间的比赛)和N,"种类"的数目1 <= N <= 10,000。
后面的每一行将包括两个整数来描述一个"种类":第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。
你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。
来自任意的"种类"的题目数目可能任何非负数(0或更多)。
计算可能得到的最大分数。
PROGRAM NAME: inflateINPUT FORMATSAMPLE INPUT (file inflate.in)300 4100 60250 120120 10035 20OUTPUT FORMAT单独的一行包括那个在给定的限制里可能得到的最大的分数。
SAMPLE OUTPUT (file inflate.out)605{从第2个"种类"中选两题第4个"种类"中选三题}Stamps(Section 3.1)邮票译by Felicia Crazy已知一个N 枚邮票的面值集合(如,{1 分,3 分})和一个上限K —— 表示信封上能够贴K 张邮票。
计算从1 到M 的最大连续可贴出的邮资。
例如,假设有1 分和3 分的邮票;你最多可以贴5 张邮票。
很容易贴出1 到5 分的邮资(用1 分邮票贴就行了),接下来的邮资也不难:• 6 = 3 + 3•7 = 3 + 3 + 1•8 = 3 + 3 + 1 + 1•9 = 3 + 3 + 3•10 = 3 + 3 + 3 + 1•11 = 3 + 3 + 3 + 1 + 1•12 = 3 + 3 + 3 + 3•13 = 3 + 3 + 3 + 3 + 1。