NOIP2010题解报告(普及组&&提高组)
- 格式:pdf
- 大小:399.26 KB
- 文档页数:6
解析1、数字统计【思路分析】这道题属于简单题,用一个FOR把数都检查一遍,里面再用while剥皮看看有多少个2。
【参考程序】VarI,n,l,r,s:integer;BeginAssign(input,’two.in’);Assign(output,’two.out’);Readln(l,r);S:=0;For i:=1 to r doBeginN:=I;While n>0 doBeginIf n mod 10=2 then s:=s+1;N:=n div 10;End;End;Writeln(s);Close(input);close(output;)End.2、接水问题【思路分析】方法一:用一个数组,存放每个水龙头当前还需要多少时间装完这桶水;然后一个一个人去轮,每次找最快装完的水龙头,接着把当前轮到的那个人所需要的时间加到格子里;最后轮完以后,还要把数组里的最大值输出。
【参考程序】Vara:=array[1..10000]of integer;b:=array[1..100]of longint;m,n,i,k,t,max,min:longint;beginassign(input,'water.in');assign(output,'water.out');reset(input);rewrite(output);readln(n,m);for i:=1 to n do read(a[i]);fillchar(b,sizeof(b),0);max:=0;k:=1;while(k<=n) dobeginmin:=maxlongint;t:=0;for i:=1 to m doif b[i]<min thenmin:=b[i];t:=i;end;b[t]:=b[t]+a[k];k:=k+1;if b[t]>max then max=b[t];end;writeln(max);close(input);close(output);end.方法二:用一个数组,存放每个水龙头当前还需要多少时间装完这桶水,并按照时间长短从大到小安排好;然后一个一个去轮,显然最快装完的水龙头总是最后一个,这样只要把当前轮到的那个人所需的时间加到最后那个元素里,再把数组排序好(很明显,这里要用插入排序效率最高);最后只要输出数组第一个元素就可以了。
NOIP2010普及组复赛解题报告(pascal)---------By 锦云第一题:two.pas本题没有什么技术含量,主要有三种方法:1.用枚举(找范围再分别处理,很麻烦)2.用分解(一步步分解,较简便)3.用先转换成字符串再做(很简便)参考程序:(在此只提供第二种解法的分解部分和第三种解法)第二种:Function fjtwo(a:integer):integer;Var cnt,tmp:integer;BeginCnt:=0;While a>0 doBeginTmp:=a mod 10;If tmp=2 then inc(cnt);Tmp:=tmp div 10;End;Fjtwo:=cnt;End;第三种:Var s:string;L,r,i,j,cnt:integer;BeginAssign(input,’two.in’);reset(input);Assign(output,’two.out’);rewrite(output);Readln(l,r);Cnt:=0;For i:=l to r doBeginString(I,s);For j:=1 to length(s) doIf s[i]=’2’ then inc(cnt);End;Writeln(cnt);Close(input);Close(output);End.第二题:water.pas本题主要是考验考生们的细心程度,从而找到最佳方案。
想了一想,本题采用模拟法,于是有了加或者减的方法。
1.减法(纯粹模拟)2.加法(更优模拟)注:减法时最好不要时间一点一点的模拟,找最小得数减。
参考程序:(本题提供较简单的写法加法)Var a:array[1..10000] of integer;N,mI,j,k:longint;BeginAssign(input,’water.in’);reset(input);Assign(output,’water.out’);rewrite(output);Readln(n,m);For i:=1 to n doRead(a[i]);For i:=m+1 to n doBeginK:=1;For j:=1 to m doIf a[j]<a[k] then k:=j;Inc(a[k],a[i]);End;K:=1;For i:=1 to m doIf a[i]>a[k] then k:=I;Writeln(a[k]);Close(input);Close(output);End.第三题:missile.pas本题实在是很难解决,n最大可以达到100000,而最优解的算法可以用搜索,但是n太大时,时间肯定不行,只好退而求其次,用贪心算法(无法得最优解但有70分,很不错了)参考程序:(贪心)Var l,n,x1,y1,x2,y2,tmpx,tmpy,max1,max2,jg1,jg2:longint;beginassign(input,'missile.in');reset(input);assign(output,'missile.out');rewrite(output);readln(x1,y1,x2,y2);readln(n);max1:=0;max2:=0;for i:=1 to n dobeginreadln(tmpx,tmpy);jg1:=sqr(abs(tmpx-x1))+sqr(abs(tmpy-y1));jg2:=sqr(abs(tmpx-x2))+sqr(abs(tmpy-y2));if (jg1>max1)and(jg2>max2) then if jg1<jg2 then max1:=jg1else max2:=jg2;end;writeln(max1+max2);close(input);close(output);end.第三题:解答本题,必须看清题意,知道以下几点:一、只需要选两次,由于比胜负靠的是双方武将中默契值最大的一对,所以除了默契值最大的一对,其他的武将都是没用的。
CSP-J (NOIP提高组) 复赛2010-2020考查内容NOIP2017提高组T4奶酪深搜、广搜、并查集T5宝藏状压DPT6列队线段树NOIP2016提高组T1玩具谜题模拟T2天天爱跑步倍增LCAT3换教室动态规划(高级)T4组合数问题前缀和、杨辉三角T5蚯蚓队列、单调性T6愤怒的小鸟状压DPNOIP2015提高组T1神奇的幻方模拟T2信息传递并查集T3斗地主动态规划(高级)、深搜T4跳石头二分T5子串滚动数组、动态规划(高级) T6运输计划二分、LCA、非递归NOIP2014提高组T1生活大爆炸版石头剪刀布模拟T2联合权值动态规划(高级)、前缀和T3飞扬的小鸟动态规划(高级)T4无线网络发射器选址枚举T5寻找道路最短路T6解方程数论、枚举NOIP2013提高组T1转圈游戏快速幂T2火柴排队归并排序、逆序对T3货车运输最小生成树、LCA、倍增T4积木大赛贪心T5花匠贪心T6华容道广搜、剪枝NOIP2012提高组T1Vigenere密码枚举、模拟T2国王游戏贪心、高精度T3开车旅行平衡树、倍增T4同余方程扩展欧几里得T5借教室线段树T6疫情控制二分、倍增NOIP2011提高组T1铺地毯模拟T2选择客栈动态规划(高级)、RMQ T3Mayan游戏T4计算系数组合数学T5聪明的质监员二分T6观光公交贪心NOIP2010提高组T1机器翻译队列T2乌龟棋动态规划T3关押罪犯二分、并查集T4引水入城广搜、动态规划T3摆渡车动态规划(高级) T4对称二叉树二叉树NOIP2017普及组序号题名考查内容T1成绩顺序结构T2图书管理员结构体排序T3棋盘深搜、剪枝T4跳*房*子二分、动态规划NOIP2016普及组序号题名考查内容T1买铅笔一重循环T2回文日期回文T3海港大模拟、队列T4魔*法*阵枚举、前缀和NOIP2015普及组序号题名考查内容T1金*币一重循环T2扫*雷*游*戏二维数组T3求和组合数学T4推销员贪心、优先队列NOIP2014普及组序号题名考查内容T1珠心算测验模拟T2比例简化枚举、gcdT3螺旋矩阵模拟、找规律T4子矩阵动态规划(高级)NOIP2013普及组序号题名考查内容T1记数问题二重循环T2表达式求值栈T3小朋友的数字动态规划(高级) T4车站分级拓扑排序NOIP2012普及组序号题名考查内容T1质因数分解一重循环、质数T2寻*宝模拟、取模T3摆花背包、动态规划T4文化之旅最短路NOIP2011普及组序号题名考查内容T1数字反转进制转换T2统计单词数字符串T3瑞士轮归并排序T4表达式的值动态规划(高级)、栈NOIP2010普及组序号题名考查内容T1数字统计二维数组T2接水问题模拟T3导*弹*拦*截贪心T4三*国*游*戏贪心、博弈。
NOIP2010初赛模拟试题(六)(普及 Pascal语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一.单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案。
)1、.在所有由两个1和六个0组成的8位二进制整数(补码)中,最小的数是:()A.-127B.-64 C.-128 D.-652、.在一棵二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序()A.都不相同B.完全相同C.先序和中序相同,而与后序不同D.中序和后序相同,而与先序不同3、下面有效的IP地址是:()A.202.280.130.45 B.130.192.33.45C.192.256.130.45 D.280.192.33.4564、一台具有1024*768分辨率、可显示65 536种颜色的显示器,其显示适配器(显示卡)上显示存储器容量的配置为:()A.512K B.1MB C.大于1.6MB,小于2MB D.2MB5、进行二分法查找,则线性表()A.必须顺序方式存储B.必须以链接方式存储,且数据元素已按值排好序C.必须以链接方式存储D.必须以顺序方式存储,且数据元素已按值排好序6、机器语言是用()编写的。
A.二进制码B.ASCII码C.十六进制码D.国标码7、一棵含有101个结点的完全二叉树存储在数组A[1..101]中,对1≤k≤101,若 A[k]是叶子结点,则k的最小值是:()A.51 B.50 C.49 D.488、不同的计算机,其指令系统也不相同,这主要取决于()A. 所用的操作系统B. 系统的总体结构C. 所用的CPUD. 所用的程序设计语言9、计算机主机是由CPU 与()构成的。
A.控制器B。
输入、输出设备C.运算器D.内存储器10、计算机系统总线上传送的信号有()。
A.地址信号与控制信号B.数据信号、控制信号与地址信号C.控制信号与数据信号D.数据信号与地址信号11、计算机的运算速度取决于给定的时间内,它的处理器所能处理的数据量。
全国信息学奥林匹克联赛(NOIP2010)复赛普及组(请选手务必仔细阅读本页内容)一.题目概览中文题目名称数字统计接水问题导弹拦截三国游戏英文题目名称two water missile sanguo可执行文件名two water missile sanguo 输入文件名two.in water.in missile.in sanguo.in 输出文件名two.out water.out missile.out sanguo.out每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 10每个测试点分值10 10 10 10 比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统传统二.提交源程序文件名对于pascal语言two.pas water.pas missile.pas sanguo.pas 对于C语言two.c water.c missilel.c sanguo.c 对于C++语言two.cpp water.cpp missile.cpp sanguo.cpp三.编译命令(不包含任何优化开关)对于pascal语言fpc two.pas fpc water.pas fpc missile.pas fpc sanguo.pas对于C语言gcc –o twoTwo.c -lm gcc –o waterwater.c -lmgcc –o missileball.c -lmgcc –o sanguosanguo.c -lm对于C++语言g++ –o twotwo.cpp -lmg++ –o seatwater.cpp -lmg++ –o missilemissile.cpp -lmg++ –o sanguosanguo.cpp -lm四.运行内存限制运行内存上限128M 128M 128M 128M注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
作者:钟野梓序今年Noip2010初赛刚结束,网上便铺天盖地地响起了“今年初赛好容易”“分数线一定很高,怎么办……”之类的声音。
确实,自2008年起,Noip初赛难度确有逐年下降的趋势,然而这并不是出题水平降低的缘故,相反,我认为这是中国计算机协会(下称CCF)对于N oip考核目的的审视和改变所导致的必然结果。
因此,我试图通过深入解析本届Noip初赛试囗题,来探寻这种变化下面深层的规律,从而令信息学竞赛选手能更好地备战往后数届的Noip初赛,让初赛不再成为一个问题。
由于条件所限,本文仅以Pascal语言的提高组试囗题作为对象进行分析,相对于普及组而言提高组试囗题一向具有较高的难度和较好的区分度,作为研究对象是个很好的选择;至于说语言的选择,仅是因为笔者个人选择原因。
一、概况本届题目在设置方面与往年相似,由选择题(普及组仅有单项选择题,提高组则有单项选择题与不定项选择题)、问题求解、阅读程序写结果及完善程序四大部分组成;但值得注意的是,今年提高组试囗题的分值设计与往年出现了较大的不同,除了选择题仍然是30分(15分单项+15分不定项),其余部分分值均发生了变化,其中问题求解由10分上升到15分,阅读程序由32分下降到28分,完善程序由28分下降到27分。
由于是第一年实行这种分值,目前暂时无法定言背后的含义,然而或许CCF在初赛更加重视选手的数学素质,而弱化了对于阅读程序能力的考察。
众所周知,阅读程序的能力并不能非常真实地反映选手的程序能力,并且纵观近几年的阅读程序题已没有了什么新意,这也可看做是一个“求新求变”的信号。
至于试囗题整体难度方面较上年有了明显下降,其中问题求解第一题可以看做是考察选手的语文水平,而阅读程序更是没有了以往的“死算”题(即给定若干常数,在程序中设置一系列运算过程,让选手进行阅读计算类型的题目),完善程序给定的源代码风格良好,第二题竟然还加上了注释,这不能不说就是一种降低难度的举动。
全国信息学奥林匹克联赛(NOIP2010)复赛_普及组_解题报告(pascal)全国信息学奥林匹克联赛(NOIP2010)复赛普及组解题报告1.数字统计(two.pas/c/cpp)【问题描述】请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。
比如给定范围[2, 22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6次。
【算法思路】枚举法,依次将L至R转化为字符串,查找当中有多少个”2”.【程序代码】program two;varl,r:1..10000;i,j,h,c:longint;s:string;beginassign(input,'two.in');assign(output,'two.out');reset(input);rewrite(output);readln(l,r);c:=0;for i:=l to r dobeginstr(i,s);h:=length(s);for j:=1 to h doif s[j]='2'then c:=c+1;end;writeln(c);close(input);close(output);end.2.接水问题(water.pas/c/cpp)【问题描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。
现在有n 名同学准备接水,他们的初始接水顺序已经确定。
将这些同学按接水顺序从1到n 编号,i号同学的接水量为w i。
接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。
当其中某名同学j 完成其接水量要求w j 后,下一名排队等候接水的同学k马上接替j 同学的位置开始接水。
这个换人的过程是瞬间完成的,且没有任何水的浪费。
NOIP2010第十六届初赛试题及答案(普及组Pascal)NOIP2010第十六届初赛试题及答案(普及组Pascal) PDF格式第十六届全国青少年信息学奥林匹克联赛初赛试题(普及组 Pascal 语言两小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一. 单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案。
)1.2E+03表示()。
A.2.03B.5C.8D.20002.一个字节(byte)由()个二进制位组成。
A.8B.16C.32D.以上都有可能3.以下逻辑表达式的值恒为真的是()。
A.P∨(﹁P∧Q) ∨(﹁P∧﹁Q)B.Q∨(﹁P∧Q) ∨(P∧﹁Q)C. P∨Q∨(P∧﹁Q) ∨(﹁P∧Q)D.P∨﹁Q∨(P∧﹁Q) ∨(﹁P∧﹁Q)4.Linux下可执行文件的默认扩展名为()。
A.exeC.dllD.以是都不是5.如果树根算是第1层,那么一棵n层的二叉树最多有()结点。
A.2n-1B.2nC.2n+1D.2n+16.提出“存储程序”的计算机工作原理的是()。
A.克劳德·香农B.戈登·摩尔C.查尔斯·巴比奇D.冯·诺依曼7.设X、Y、Z分别代表三进制下的一位数字,若等式XY+ZX=XYX在三进制下成立,那么同样在三进制下,等式XY×ZX=()也成立。
A.YXZB.ZXYC.XYZD.XZY9.前缀表达式“+3×2+5 12”的值是()。
A.23B.25C.37D.6510.主存储器的存取速度比中央处理器(CPU)的工作速度慢得多,从而使得后者的效率受到影响。
而根据局部性原理,CPU所访问的存储单元通常都趋于聚集在一个较小的连续区域中。
于是,为了提高系统整体的执行效率,在CPU中引入了()。
A.寄存器B.高速缓存C.闪存D.外存11.一个字长为8位的整数的补码是11111001,则它的原码是()。
NOIP2010题解报告提高组No.1 机器翻译时间及空间复杂度题解时间复杂度:O(NM) 空间复杂度:O(M) 方法一:模拟整个机器翻译的过程,判断某一元素是否在当前内存中,可以采用顺序遍历整个内存的方式来处理。
预期分数100分时间复杂度:O(N) 空间复杂度:O(M) 方法二:如果将题目N、M的数据范围改成100000,那么方法一就会因超时而挂掉,这时我们可以根据题目中说每个数都不超过1000来优化算法,我们可以建立一个标记数组(hash表)来判断i是否在内存中。
预期分数100分时间复杂度:O(N) 空间复杂度:O(M) 方法三:如果将题目N、M的数据范围改成100000且每个数都不会超过maxlongint,那么方法二也同样会挂掉,我们可以继续改进算法,我们可以将每一个数都mod一个质数,然后根据这个质数建立链表(hash表)。
预期分数100分提高组No.2乌龟棋时间及空间复杂度题解时间复杂度:O(M!) 空间复杂度:O(N) 方法一:枚举每一张卡片的使用顺序,对于每一种顺序求的当前的解,保留最优解即可。
预期分数30分时间复杂度:O(NM^4) 空间复杂度:O(NM^4) 方法二:使用动态规划算法。
用f[I,j1,j2,j3,j4]表示前i个格子,用j1张1号卡片,j2张2号卡片,j3张3号卡片,j4张4号卡片所得到的最优值,则F[I,j1,j2,j3,j4]=A[i]+max{F[i-1,j1-1,j2,j3,j4], 当j1>0F[i-1,j1,j2-1,j3,j4], 当j2>0F[i-1,j1,j2,j3-1,j4], 当j3>0F[i-1,j1,j2,j3,j4-1]} 当j4>0边界条件f=-oo f[1,0,0,0,0]=0最后结果f[n,tot[1],tot[2],tot[3],tot[4]] tot[i]表示第i种棋的个数预期分数50分时间复杂度:O(NM^3) 空间复杂度:O(NM^3) 方法三:方法二在表达状态上有浪费,因为j4根据I,j1,j2,j3的关系就可以算出来,则现在的转移方程式变为F[I,j1,j2,j3]=A[i]+max{F[i-1,j1-1,j2,j3], 当j1>0F[i-1,j1,j2-1,j3], 当j2>0F[i-1,j1,j2,j3-1], 当j3>0F[i-1,j1,j2,j3]} 当(i-j1-2*j2-3*j3) div 4<=tot[4] 边界条件f=-oo f[1,0,0,0]=0最后结果f[I,j1,j2,j3]预期分数100分时间复杂度:O(M^4) 空间复杂度:O(M^4) 方法四:方法三在表达状态上依然有浪费,因为i可以通过j1,j2,j3,j4的关系算出来,而i>=j4,这样我们就得到了比方法三更优的算法用f[j1,j2,j3,j4]表示已经使用了j1张1号卡片,j2张2号卡片,j3张3号卡片,j4张4号卡片,所得到的最优质,则F[j1,j2,j3,j4]=A[1+j1+j2*2+j3*3+j4*4]+max{F[j1-1,j2,j3,j4], 当j1>0F[j1,j2-1,j3,j4], 当j2>0F[j1,j2,j3-1,j4], 当j3>0F[j1,j2,j3,j4-1]} 当j4>0边界条件f=-oo f[0,0,0,0]=a[1]最后结果f[tot[1],tot[2],tot[3],tot[4]]预期分数100分提高组No.3 关押罪犯时间及空间复杂度题解时间复杂度:O(2^N) 空间复杂度:O(N^2) 方法一:枚举每一个人是在第一个监狱或第二个监狱,用邻接矩阵来存图,找到每一种情况的解,保留最优解即可。
预计分数30分时间复杂度:O(Mlog(10^9))空间复杂度:O(M) 方法二:由于M过大,且为稀疏图,这样我们可以采用链表的方式去存储。
如果直接求解不好求,那么我们可以尝试去判断一个解是否成立。
这个过程与猜数游戏非常类似,如果猜大了,那么你就往高猜,如果猜小了,那么你就往低猜,这样每次分段的时间复杂度为O(log(N)),判断是否为解需要O(1),故总时间复杂度为O(log(N))。
对应到这个题目,如果我们判断一个解的时间复杂度比较低的话,就可以采用二分答案的方式。
判断一个解是否成立,我们可以判断哪些人不能和这个人分成一组,既判断这个图是否为二分图,我们可以采用染色的方式,1号犯人颜色为1,则如果连接1号犯人的人边权大于我们猜到的值,则这个犯人颜色为2,反之颜色为1,对于其他犯人也做类似处理。
如果在这个过程中没有发生冲突(指本次需要染一种颜色,但是这个犯人本身已经有另一种颜色的情况),则表明猜数猜小了,反之为猜大了或猜中了。
预期分数100分时间复杂度:O(MlogM) 空间复杂度:O(M) 方法三:本题虽然可以二分去做,但是是经典的2-sat问题,所有的点分成两个集合。
把每一个点拆成0和1 两个点,如果有边相连接,则a0与b1相连,a1与b0相连,b0和a1相连,b1与a0相连。
我们按照边权从大到小排序,依次插入,如果出现了环(a0与a1相连),则出现了矛盾。
上述过程可以使用并查集去维护。
预期分数100分提高组No.4 引水入城时间及空间复杂度题解时间复杂度:O(NM) 空间复杂度:O(NM) 方法一:只考虑无解的情况,将每一个(1,i)作为起点,进行Flood Fill,如果(n,i)有遍历不到的情况,则直接输出答案。
预期分数30分时间复杂度:O(NM) 空间复杂度:O(NM) 方法二:只考虑无解和N=1时的情况。
对于N=1时,我们可以用排序求出第i大海拔高度的位置,按照海拔高度从大到小的数进行处理,如果当前节点还没有被访问,则这个节点向左和向右扩展,直到全部节点都被访问时,输出解。
这样的贪心策略一定是正确的,因为如果海拔高度高的节点能遍历到海拔高度低的节点,那么这个海拔高度低的能遍历到新的节点海拔高度高的节点也一定能遍历到。
在结合方法一,预期分数40分时间复杂度:O(2^M) 空间复杂度:O(NM) 方法三:只考虑无解、N=1、M<=20的情况。
对于M<=20,因为一定有解,我们可以枚举子集的办法将所有情况列出来,对于每种情况进行一次Flood Fill,取最优解即可。
预期分数60分时间复杂度:O(NM^2) 空间复杂度:O(NM) 方法四:首先需要用到一个结论,如果(1,i)能遍历到(n,i)的某些点,那么这个区间一定是连续的。
用反证法,对于其逆命题,如果这个区间不是连续的,假设现在分成两段。
如下图,从红色节点出发,到达最后一行的区间会被紫色节点(表示不可到达)所分成两段由于一定可以由第一行的节点访问到紫色节点,那么这个节点访问到紫色节点的路径中一定会包含红色节点所遍历到的路径(图中的绿色路径),从而证明了假设不成立,则原命题成立。
下面我们可以将问题分成两个部分:1.求(1,i)的某个节点能控制到(n,i)的区间[st[i],ed[i]]2.使用最少的区间使整个线段遍历对于第一问,我们只需要枚举每一个第一行的点做一次Flood Fill 即可。
时间复杂度为O(NMM)对于第二问,可以使用动态规划的方法来做,设f[i]覆盖前i段,需要最少的几个区间,则转移方程为F[i]=min(st[i]-1) 当st[i]<=i<=ed[i]边界条件f=-oo f[0]=0;最终答案f[m]时间复杂度为O(NM)预期分数90-100分时间复杂度:O(NM) 空间复杂度:O(NM) 方法五:对于方法四,我们可以继续优化求(1,i)的某个节点能控制到(n,i)的区间[st[i],ed[i]],如果从第一行求不方便,我们就可以从最后一行开始求,由于st[i]和ed[i]求的方法类似,在这里只介绍st[i]的求法。
按照(n,1)到(n,m)的顺序进行Flood Fill(注意这里遍历条件和第一行往第N行的条件相反),将遍历到的节点标记,以后遇到这个节点直接break,如果能遍历到第1行的某个节点,则st[i]就为起点(n,i)的i值。
这样做的原因是,如果(n,i)为起点是第一个遍历到(1,k),则st[K]=i一定是最小的。
这样在最坏情况下每一个节点仅会被访问一次,所以时间复杂度为O(NM)。
预期分数100分普及组No.1数字统计时间及空间复杂度题解时间复杂度:O(N) 空间复杂度:O(1) 方法一:直接用一个循环枚举l到r的所有数,对每一个数字进行判断(判断的方式有:转成字符串,一直mod 10等方法求的2的出现次数)。
预期分数100分时间复杂度:O(1) 空间复杂度:O(1) 方法二:如果数据范围改成<=10^10,那么方法一必然超时。
采用动态规划的算法,用f[i]表示0到10^i-1中出现2的次数,则F[i]=1 当i=1时F[i]=f[i-1]*10+10^(i-1) 当i>1时因为ans=count(r)-count(l-1) count(k)表示1-k之间出现2的次数和下面模拟count(3292)时的情况:把千位为3分成三种情况:1.千位为0,1(0相当于没有千位) f[3]+f[3]2.千位为2 f[3]+10003.千位为3 继续算292时的情况把百位为2分成三种情况:1.百位为0,1 f[2]+f[2]2.百位为2 92+1+继续算92的情况……全部累加以来即count的值预期分数100分(相关加强版在tyvj-P1409)普及组No.2 接水问题时间及空间复杂度题解时间复杂度:O(不好估计)空间复杂度:O(N) 方法一:按照时间来模拟,每次将时间加1,如果有同学的水加满后,则让下一个未接水的同学过来接水。
预期分数100分时间复杂度:O(NlogM) 空间复杂度:O(N) 方法二:其实我们仅需要关注换人的一瞬间,其他时间没有任何意义。
我们用a[i]表示第i个水龙头需要放水的量,则初始情况a[i]=w[i](i∈m),每次换人的时候,肯定是a[i]最小的那个水龙头(因为需要放的水最小,所需要的时间就最小),将这个a[i]加上下一个需要接水的同学的时间,最终找到最大的a[i]既是本题的解。
于是本题变成了一个RMQ(求区间最大最小值)的问题,可以采用线段树、堆、ST算法等。
预期分数100分(相关加强版本在tyvj-P1405)普及组No.3导弹拦截时间及空间复杂度题解时间复杂度:O(1) 空间复杂度:O(1) 方法一:仅考虑N=1的情况,只需要判断距离哪一个拦截导弹系统近即可。
预期分数10分时间复杂度:O(2^N) 空间复杂度:O(N) 方法二:仅考虑N<=2的情况,枚举哪一些被1号系统拦截,另外的被2号系统拦截。