2017.10.26试题(NOIP DAY1难度)

来源:互联网 发布:centos snmp 安装配置 编辑:程序博客网 时间:2024/05/16 11:50

T1:为爱追寻

【问题描述】

话说一年半以前,紫萱学姐展开了对杨廷学长的追求。在经历了不懈的努力之后,学姐终于成为了一名……金牌单身狗。但是这位痴情的少女并没有放弃,于是决定在保送之后继续进行这项征程,并为参加比赛的各位在役OI选手送上半熟的狗粮。
历经了半年的停课之后,学姐回到了陌生又熟悉的班里,但是她已经找不到学长的位置了。于是她决定采用一种高效率的寻找方法:瞎找法。
我们将学姐的班级视为一个二维平面,每个整数坐标对应一张桌子,学姐从班级的某个位置(x0,y0)开始瞎找,每次检查一下当前所在的这个桌子是谁的,然后进行下一次移动,直到找到学长的桌子(xt,yt),便停止移动。
给出学姐的初始坐标和每次移动的方向,请你判断在寻找的过程中学姐一共检查了多少张桌子。

【输入】
第一行五个整数n,x0,y0,xt,yt,分别代表学姐移动的次数和学长桌子的坐标。
接下来n行,第i行两个整数dx,dy,代表学姐第i次移动沿与x/y轴平行的方向移动了dx/dy个单位。如果dx/dy为负数,表示沿x/y轴的反方向移动了-dx/-dy个单位。

【输出】
输出学姐检查过的桌子总数,如果学姐进行完所有移动之后都没有找到学长的桌子,那么输出“SingleDogMZX”(不含引号)。

【输入输出样例1】
lovefinding.in lovefinding.out
5 1 1 3 2
1 1
0 -2
0 2
1 0
0 -1
4

【数据范围】
样例中,检查了(1,1)(2,2),(2,0),(3,2)共4张桌子
对于30%的数据,学姐每次移动时不会移动到已经检查过的桌子。
对于60%的数据,任何时刻学姐的横纵坐标都为≤2500的自然数。
对于90%的数据,任何时刻学姐的横纵坐标的绝对值都为≤2500的自然数。
对于100%的数据,任何时刻学姐的横纵坐标的绝对值都为≤10^9的自然数,n≤1000000。

这道题考试的时候只想过90分就行了,并没有100分的梦想 。90分的程序还是比较好写的,开5000的数组就能把负数也存下了,每次标记数组最后统计输出即可拿到90分。

100的数据仍在int里 需要用hash表存储坐标,但是注意要选择合适的散列函数。

考试的时候应该是能想到hash表的,但是相对于后面T3的30分我还是放弃了这10分的梦想,毕竟分数才是硬杠杠(但是考完之后还是很值得我们去写正解的程序)= =

T2 零食店

【问题描述】
成功找到了学长之后学姐感觉到有些饿,于是决定去附近的零食店给自己和学长买些零食。
焦作市的有n家零食店,由m条道路连接着这些零食店,每条道路都有自己的长度l,每家零食店都有自己的消费指数。
由于学姐是个穷B,所以去买零食的路上不能经过某些消费指数超过一定限度的店。
同时由于学姐体力有限,所以去买零食的过程中走的路程不能太长。
想来想去学姐决定去问学长买什么零食比较好,反正到最后都是学长吃╮(╯_╰)╭
在去问之前,学姐准备先做好准备,她把焦作市(所有零食店)的地图给了你,希望你能编出一个程序快速回答她从某个零食店出发,在上述限制下有多少家零食店可供她挑选。

【输入】
第一行三个正整数n,m,q,分别代表零食店数,道路数和询问数。
接下来一行n个正整数,第i个正整数vi代表第i家零食店的消费指数。
接下来m行,第i行三个正整数x,y,l,代表第i条道路连接编号为x和y的两个零食店,长度为l。
接下来q行第i行三个正整数s,c,d,代表第i个询问要求从s出发,所经过的零食店的消费指数不能超过c(除了起点和终点以外),且行走路程不超过d。
【输出】
一共q行,第i行一个整数代表在第i个询问的要求下有多少家零食店可供学姐挑选。

【输入输出样例1】
snackstore.in snackstore.out
5 5 2
1 2 3 4 5
1 2 1
1 3 4
2 3 2
1 4 3
2 5 1
1 1 3
2 1 2
2
3

【输入输出样例2】
snackstore.in snackstore.out

【数据范围】
样例中第一个询问能去编号为2/4的零食店。
第二个询问能去编号为1/3/5的零食店。
对于40%的数据,n≤10,m≤20,q=1。
对于70%的数据,m≤500,q≤10000。
对于100%的数据,n≤100,m≤10000,q≤1000000,vi,c,d≤10^9,1≤x,y,s≤n,l≤10^6。

这道题我的想法是深搜,每次搜都判断该点的消费指数能否继续扩展,并且有个显然的剪枝,如果某次到某点剩余的路程小于之前到该点的最大剩余路程,那么这次肯定不会再到达新的点。期望时间复杂度为O(qmlogm)。

该题的正解是floyd与dp(惊了!)g[k][i][j]代表从i出发只经过消费指数前k的点,距离i第j短的点距离为多少这样的话每次询问只需要二分出k,然后在g[k][i]数组中二分就可以了。
预处理时我们可以当做动态加点的全源最短路,我们用动态规划的转移方程表示这个过程:用f[k][i][j]代表i出发只经过消费指数前k的点,i到j的最短路为多少
状态转移方程为:f[k][i][j]=min{f[k-1][i][j],f[k-1][i][v[k]]+f[k-1][v[k]][j]}(其中v[k]代表消费指数排第k的点,1≤i,j≤n)

写了这么多dp,刚刚复习过图论看到这题只想到爆搜可以说是很不应该了= =

T3昆特-冠位指定

【问题描述】
酒足饭饱之后(没有后三个字),紫萱学姐打开了手机上的一款游戏,叫做GwentGrandOrder,简称GGO,但是由于光腚总菊的要求,手机游戏中不得出现英文,所以就有了一个很low的中文名:昆特-冠位指定。
看到学姐玩这个游戏,学长也产生了浓厚的兴趣并开始了围观,学姐决定给学长展示一下自己的牌技。
这是一款卡牌游戏,每个人用自己的卡组进行对战,游戏开始时每个人从牌堆中抽取若干张牌,然后依次打出手牌,为了简化这个游戏,我们假定牌堆中只有以下三种牌:
1. 单位牌,分为近战/远程/攻城/敏捷单位四种牌,每张牌都有自己的力量值,前三种单位牌使用时将该牌置于己方战场中的对应排,敏捷单位可以置于近战或远程排,放置后不可移动且受该排的特殊牌影响。
2. 特殊牌,分为霜霰/浓雾/地形雨/史凯利杰风暴/天晴五种天气牌和领导号角,前四种天气牌的效果分别为将双方的所有近战/远程/攻城/远程和攻城单位力量降为1,天晴的效果为驱散当前所有天气牌效果。领导号角可以在最终计算力量值时将本方其中一排所有单位牌的力量翻倍。
3. 英雄牌,与单位牌使用方法相同,但是英雄牌的力量值不受任何特殊卡牌影响而增加或减少。
单位牌和英雄牌可能带有“间谍”属性,带有该属性的单位牌或英雄牌在使用时将会被置于对方战场,同时使用者将会从牌堆中抽取两张牌。
双方出牌结束或无牌可出时,计算双方场上所有牌的力量值之和,力量值大的一方获胜。
注意:如果一张单位牌同时受到负面天气和领导号角的影响,那么这张牌的力量值应该为2。同时一张力量值为0的单位牌受到负面天气影响时力量值不会变为1。
假设由于某种原因,对手已经打出m张单位牌(以总牌数和力量之和的形式表示,敌方敏捷单位以近战或远程方式直接使用,即描述敌方单位或英雄牌时不会出现敏捷属性)和特殊牌并结束出牌。紫萱学姐的卡组中有n张牌,而且可以从中抽取k张作为初始手牌,由于学长的欧气加持,紫萱学姐每次抽牌时都可以抽到自己想抽的那一张牌。但是这是一个氪金看脸游戏,每张牌都有一定的稀有度,作为一个在NOI上用尽人品从亚变非的新晋酋长,紫萱学姐希望能用尽量不稀有的卡牌战胜对手,来证明这是一个技术游戏。请你帮助紫萱学姐设计一个方案使得所使用的牌中稀有值的最大值尽可能小。由于她所使用的牌组所属阵营尼弗迦德的特性,在双方力量值相等时判定学姐胜利。

【输入】
第一行三个正整数n,m和k,意义如题目所示。
接下来m行每行描述一张牌,代表对方所出的所有牌。
接下来n行每行描述一张牌,代表紫萱学姐的牌堆。
每张牌用若干个整数表示,第一个整数代表该牌的稀有度vi,第二个整数代表该牌类型(1位单位牌,2为特殊牌,3为英雄牌)。
若该牌为单位牌或英雄牌,接下来三个自然数代表该牌的种类(1~4分别为近战/远程/攻城/敏捷)和力量值,以及该牌是否为间谍牌(0为正常单位或英雄,1为间谍牌)。
若该牌为特殊牌,接下来一个整数代表该牌的类型,0~5分别为领导号角/霜霰/浓雾/地形雨/史凯利杰风暴/天晴。若该牌为领导号角且是对方所出的牌,接下来一个正整数代表此牌所作用的位置,1~3分别对应近战/远程/攻城。

【输出】
一个正整数,为最优解中所使用的卡牌稀有值最大值,如果无论如何学姐也无法赢得这场游戏,输出“SingleDogMZX”(不含引号)。

【输入输出样例1】
gwent_grandorder.in gwent_grandorder.out
5 5 1
1 1 1 5 0
1 1 1 5 0
1 1 3 10 0
1 3 1 5 1
1 2 0 1
7 3 1 15 0
8 1 1 5 1
9 2 1
10 1 2 10 0
11 2 0
9

【输入输出样例2】
gwent_grandorder.in gwent_grandorder.out

【数据范围】
样例中
游戏开始时,敌方战场中有两个力量为5的近战单位和一个力量为10的攻城单位,且敌方近战排存在领导号角。我方战场有一个力量为5的近战间谍英雄。
我方手牌为力量为15的近战英雄杰日天、力量为5的近战间谍单位、霜霰、力量为10的远程单位、领导号角。
开始时抽取间谍牌(稀有度为8),并将其置于对方战场,抽取英雄牌(稀有度为7)和霜霰(稀有度为9)打出并结束回合。
由于英雄不受特殊牌影响,我方力量总和为15+5=20。
由于霜霰和领导号角的双重影响,敌方力量总和为2+2+2+10=16
我方胜利,所用牌稀有度最大值为9,为最优解。
对于测试点1/2,n,m≤10。
对于测试点3/4,n,m≤1000。
对于测试点5/6,n,m≤100000。
对于测试点1/3/5,不含间谍牌。
对于测试点1/2/3/4/5/6,不含特殊牌
对于测试点7/8,n,m≤10000。
对于测试点9/10,n,m≤100000。
对于所有测试点,vi≤10^9,所有单位的力量值≤10000。

刚刚看到这道题我也是蒙蔽的,愣是不知道怎么处理这么多牌。但是仔细观察数据说明,前60分不含特殊牌,其中前30分不含间谍牌
再看题目”请你帮助紫萱学姐设计一个方案使得所使用的牌中稀有值的最大值尽可能小“ 最大值最小让我想到的就是二分答案。
30分程序贼好写:没有特殊牌没有间谍牌,那么敌方的力量值是确定的,二分稀有度,然后将稀有度小于这个二分值按照力量值sort由大到小排序,取前k个(不足k个能取几个取几个),与敌方的力量值比较即可。
60分的程序也不难,但是考试的时候犯了很多错误,最后迟了10分钟才写完。这里多了间谍牌。显然敌方的间谍牌是很好处理的,直接加入我方的力量值即可。然后同样也是二分稀有度,也是sort排序,但是间谍的排序应该是力量值由小到大排序,因为这个力量值是给敌方的,而对我方的优化是相同的。而且前60分的点也很小,只要在二分里暴力枚举选取间谍牌的个数就可以拿60分了。

80分数据范围比较小但是出现了特殊牌,这里其实也可以暴力枚举(然而考试的时候并没有时间加特殊包了),仍然是用二分做。也是暴力枚举使用特殊牌的使用量。(也许会TLE?期望复杂度应该是能过的)怕TLE?MZX大佬提供了一个优化:那就是影响单位力量值的只有每排是否有负面天气/是否有领导号角,这样可以去掉一些重复的枚举,枚举量变为O(2^6)

100分的数据范围比较大,枚举特殊牌是不可避免的(因为不同的情况对答案有很大的影响),这里我们要根据我们牌的种类分类,先分为间谍和非间谍。再根据不同的兵种分,这里显而易见同样也是非常重要、考试的时候很少人会考虑到的问题:相同种类的牌不会因为特殊牌影响而改变排序。这样一来排序和枚举就是平行的关系而不是原来的包含。那么思想和前面就没什么区别了【每次从五种间谍的力量值(经过特殊牌修正)取最小值,五种非间谍取最大值比较即可,时间复杂度O(logn*(2^6*n+nlogn))。】(抄的大佬原文orz)

这道题拿高分是很难(费脑费时)的 但是可以考虑写30/60分代码还是可以再考试时间内完成的。100分的代码….还是考完之后自己当练习写吧#GG