noi导刊《冲刺noip2010 七》翻转游戏题解

合集下载

复赛noip2010提高组题解[新版]

复赛noip2010提高组题解[新版]

1.translate(20分)简单模拟。

开一个1000的队列,时刻保持队列长度不大于M,每次接受翻译请求时,先在队列中查找,查找失败则将单词加入队列。

查找使用Hash则为O(N),直接扫描O(MN),都在可接受范围内。

考试时只打了20分,原因至今不明,告诫大家对于水题不要多想,就像这道题最好不开hash,因为一个系统的可靠度是该系统所有子系统可靠度之积,程序越复杂越可能出错。

4.tortoise(50分)基础动规。

可以从题目背景中抽象出这样的问题:有一四维立方体(这里的立方体棱长不必相等,每一维对应一种卡片,每维的棱长对应该种卡片个数),每走一格(即使用一张卡片)的收益是当前位置坐标的函数。

求从(0,0,0,0)走到(a1,a2,a3,a4)最大收益。

故有方程f[x,y,z,t]=max{f[x-1,y,z,t], f[x,y-1,z,t], f[x,y,z-1,t], f[x,y,z,t-1]} + w[1 + x + y*2 + z*3 + t*4]目标状态: f[a1,a2,a3,a4]O(b^4)的代价,数据保证b<=40,完全满足要求5.prison(70分)问题可以重新描述为:寻找最小的冲突值c,使得存在一种方案,将原图分为两部分,并去掉这两部分之间的所有边后,余下的边权都不大于c。

对于这个问题我们可以二分查找c,并判定其可行性。

判定可行性的方法至今没想好。

考试的时候我是用并查集,将所有与u相连并与u之间边权大于c的点(设为点集Zu)必然不与u在同一集合中,枚举所有的u,每次将Zu合并成为一个集合,若存在某点u和Zu某个点处于同一个集合中,则c不可行,反之则可行。

但这种方法貌似存在bug,能拿70分。

如果把并查集合并查找的时间代价看作常数,则这种做法的时间代价为O(elogK),e是边数,K为最大的冲突值。

6.flow(100分)先用floodfill预处理出上方的每个格子能覆盖到下方的格子,构造一个布尔矩阵,行下标表示最上方的某个点,列下标表示最下方的某个点,矩阵对应点的值表示相应两个点的覆盖关系。

NOIP2010题解

NOIP2010题解
首先,第一题是四道题中最简单的,直接写代码,注意一些细节就可以了, 一百分也是一定要拿到手的,因为后面的分都不是很好拿。 然后是第二题,第二题就要用动态规划了,可以用最朴素的BFS来过那30% 的比较弱的数据,用最朴素的动态规划只能拿到50%左右的分,需要对动态规 划的状态进行优化,方可拿到一百分。 对于第三题,用搜索很快可拿30,代码复杂度也极低,看到规律的枚举 +BFS(floodfill)拿80分,会优化的二分(二分枚举)+BFS拿满分,只是代 码稍微麻烦些,或者有思路的用贪心+并查集也可拿满分,代码也要比二分 +BFS简单一点。 然后关于本题,数据的反复查找与读取很耗时,想不超时的一些同学需要考 虑图论中无向联通图的存储方式,邻接矩阵和完善的静态邻接表直接爆内存零 分,所以只能用动态邻接表或者双链表,笔者偷懒,用的不完善静态链表+直 接查找数据……所以,学学动态邻接表和双链表存储图看来迫在眉睫…… 最后是第四题,思路比较难,搜索的可以稳拿拿到30分,没有思路就搜索 吧。分析过后可以发现最后一题就是一个搜索+“线段覆盖”问题,对于搜索, 本体其实用DFS会比BFS快很多,对于“线段覆盖”,用动规解决就好了。
总分
400 380 340 330 320 310 300 300 290 280 280 270 270 260 260 260 260 250 250 250 240 240 240
姓名
徐明昭 张硕基 徐子尧 崔灏 田博 李光谱 吕诚 魏鑫鼎 马龙 李昭 吴文彬 李金培 李栋 李昂 杨帅 李怡君 杨东 王子晗 谢志聪 周梦溪 苏畅 许可 常泽昊
240 240 240 240 240 240 230 230 230 230 230 230 220 210 210 210 210 210 200 200

深入Noip2010初赛试题和全解

深入Noip2010初赛试题和全解

作者:钟野梓序今年Noip2010初赛刚结束,网上便铺天盖地地响起了“今年初赛好容易”“分数线一定很高,怎么办……”之类的声音。

确实,自2008年起,Noip初赛难度确有逐年下降的趋势,然而这并不是出题水平降低的缘故,相反,我认为这是中国计算机协会(下称CCF)对于N oip考核目的的审视和改变所导致的必然结果。

因此,我试图通过深入解析本届Noip初赛试囗题,来探寻这种变化下面深层的规律,从而令信息学竞赛选手能更好地备战往后数届的Noip初赛,让初赛不再成为一个问题。

由于条件所限,本文仅以Pascal语言的提高组试囗题作为对象进行分析,相对于普及组而言提高组试囗题一向具有较高的难度和较好的区分度,作为研究对象是个很好的选择;至于说语言的选择,仅是因为笔者个人选择原因。

一、概况本届题目在设置方面与往年相似,由选择题(普及组仅有单项选择题,提高组则有单项选择题与不定项选择题)、问题求解、阅读程序写结果及完善程序四大部分组成;但值得注意的是,今年提高组试囗题的分值设计与往年出现了较大的不同,除了选择题仍然是30分(15分单项+15分不定项),其余部分分值均发生了变化,其中问题求解由10分上升到15分,阅读程序由32分下降到28分,完善程序由28分下降到27分。

由于是第一年实行这种分值,目前暂时无法定言背后的含义,然而或许CCF在初赛更加重视选手的数学素质,而弱化了对于阅读程序能力的考察。

众所周知,阅读程序的能力并不能非常真实地反映选手的程序能力,并且纵观近几年的阅读程序题已没有了什么新意,这也可看做是一个“求新求变”的信号。

至于试囗题整体难度方面较上年有了明显下降,其中问题求解第一题可以看做是考察选手的语文水平,而阅读程序更是没有了以往的“死算”题(即给定若干常数,在程序中设置一系列运算过程,让选手进行阅读计算类型的题目),完善程序给定的源代码风格良好,第二题竟然还加上了注释,这不能不说就是一种降低难度的举动。

【题解】[Noip2010]机器翻译-C++

【题解】[Noip2010]机器翻译-C++

【题解】[Noip2010]机器翻译-C++题⽬Description⼩晨的电脑上安装了⼀个机器翻译软件,他经常⽤这个软件来翻译英语⽂章。

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英⽂单词⽤对应的中⽂含义来替换。

对于每个英⽂单词,软件会先在内存中查找这个单词的中⽂含义,如果内存中有,软件就会⽤它进⾏翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中⽂含义然后翻译,并将这个单词和译义放⼊内存,以备后续的查找和翻译。

假设内存中有 M 个单元,每单元能存放⼀个单词和译义。

每当软件将⼀个新单词存⼊内存前,如果当前内存中已存⼊的单词数不超过 M?1,软件会将新单词存⼊⼀个未使⽤的内存单元;若内存中已存⼊ M 个单词,软件会清空最早进⼊内存的那个单词,腾出单元来,存放新单词。

假设⼀篇英语⽂章的长度为 N个单词。

给定这篇待译⽂章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

Input输⼊⽂件共 2 ⾏。

每⾏中两个数之间⽤⼀个空格隔开。

第⼀⾏为两个正整数 M和 N,代表内存容量和⽂章的长度。

第⼆⾏为 N 个⾮负整数,按照⽂章的顺序,每个数(⼤⼩不超过 1000)代表⼀个英⽂单词。

⽂章中两个单词是同⼀个单词,当且仅当它们对应的⾮负整数相同。

0<M≤100,0<N≤1000Output包含⼀个整数,为软件需要查词典的次数。

Sample Input3 71 2 1 5 4 4 1Sample Output5//整个查字典过程如下:每⾏表⽰⼀个单词的翻译,冒号前为本次翻译后的内存状况:空:内存初始状态为空。

1. 1:查找单词1 并调⼊内存。

2. 1 2:查找单词 2 并调⼊内存。

3. 1 2:在内存中找到单词 1。

4. 1 2 5:查找单词 5 并调⼊内存。

5. 2 5 4:查找单词 4 并调⼊内存替代单词 1。

6. 2 5 4:在内存中找到单词 4。

7. 5 4 1:查找单词 1 并调⼊内存替代单词 2。

冲刺Noip2010模拟试题七

冲刺Noip2010模拟试题七

冲刺Noip2010模拟试题七1、数列(Sequence.pas/c/cpp)问题描述一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7。

给定A,B和n的值,要求计算f(n)的值。

输入格式输入文件(sequence.in)仅一行包含3个整数A,B和n,其中(1≤ A, B ≤1000, 1 ≤n≤100,000,000)。

输出格式输出文件(sequence.out)仅一行,一个整数,即f(n)的值。

输入样列1 1 3输出样列2说明:若输入样例为1 2 10,则输出为5。

数据规模20%的数据,n≤1,00040%的数据,n≤100,000100%的数据,n≤100,000,0002、最长路(path.pas/c/cpp)问题描述设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当<i,j>为G中的一条边时有i < j。

设w(i,j)为边<i,j>的长度,请设计算法,计算图G中<1,n>间的最长路径。

输入格式输入文件path.in的第一行有两个整数n和m,表示有n个顶点和m条边,其中(2≤n≤1500,m≤50000),接下来m行中每行输入3个整数a ,b,v表示从a点到b点有条边,边的长度为v。

输出格式输出文件path.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通,输出-1。

输入样例2 11 2 1输出样例1说明:若输入样例为2 0,则输出为-1。

数据规模20%的数据,n≤100,m≤100040%的数据,n≤1,000,m≤10000100%的数据,n≤1,500,m≤500003、木棍(wooden.cpp/pas/c)问题描述有n根木棍,每根的长度l和重量w已知。

这些木棍将被一台机器一根一根的加工。

机器需要一些启动时间来做准备工作,启动时间与木棍被加工的具体情况有关。

NOIP2010提高组初赛试题及详细解析

NOIP2010提高组初赛试题及详细解析

第十六届全国青少年信息学奥林匹克联赛初赛试题(提高组 C++语言两小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共10题,每题1.5分,共计15分。

每题有且仅有一个正确选项。

)1.与十六进制数 A1.2等值的十进制数是()A.101.2 B.111.4 C.161.125 D.177.252.一个字节(byte)由()个二进制组成。

A.8 B.16 C.32 D.以上都有可能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. exeB. comC. dllD. 以上都不是5.如果在某个进制下等式7*7=41成立,那么在该进制下等式12*12=()也成立。

A. 100B. 144C. 164D. 1966.提出“存储程序”的计算机工作原理的是()。

A. 克劳德•香农B. 戈登•摩尔C. 查尔斯•巴比奇D. 冯•诺依曼7.前缀表达式“+ 3 * 2 + 5 12 ”的值是()。

A. 23B. 25C. 37D. 6 58.主存储器的存取速度比中央处理器(CPU)的工作速度慢的多,从而使得后者的效率受到影响。

而根据局部性原理,CPU所访问的存储单元通常都趋于一个较小的连续区域中。

于是,为了提高系统整体的执行效率,在CPU中引入了( )。

A.寄存器 B.高速缓存 C.闪存 D.外存9.完全二叉树的顺序存储方案,是指将完全二叉树的结点从上到下、从左到右依次存放到一个顺序结构的数组中。

假定根结点存放在数组的1号位置上,则第k号结点的父结点如果存在的话,应当存放在数组中的()号位置。

A.2k B.2k+1 C.k/2下取整 D.(k+1)/210.以下竞赛活动中历史最悠久的是()。

冲刺NOIP2010 报数题解

冲刺NOIP2010 报数题解

报数【题目描述】CG同学又弄到一批新牛,新牛到了农场后,首先学习汉语,数的朗读成为新牛的难题。

朗读绝对值小于10亿的数。

新牛们知道汉语中有如下的朗读规则:1.首先读符号位,然后读整数部分。

整数部分之后可能出现小数点,如果有小数部分则小数点一定出现,并且读出小数点之后读小数部分。

2.符号位的读法是:(1)正数,不论正号“+”是否出现,都不必读出符号位;(2)负数最左边的符号是“-”读成“负”(以“F”来表示“负”)。

3.整数部分的读法是:(1)如果整数部分不存在或整数部分全为零则直接读成“零”(以“0”来表示“零”);(2)否则从整数部分中最左边的非零数字开始读起,然后以十,百,千,万,亿(分别以“S”,“B”,“Q”“W”,“Y”来表示)等数量单位来拼读整数部分。

4.整数部分中:(1)每一个非零数字都必须结合各个相应的数量单位读出来。

(2)每一段连续的“零”只能读成一个“零”,但是某一段连续的“零”的左侧或者右侧不存在非零数字(这里只考虑整数部分)则这一段“零”不应该读出来。

5.如果有小数部分,则首先读“点”(以“D”来表示“点”),然后从左至右有顺序的读出各个小数位。

在读小数部分的时候不可以使用十,百,千,万,亿等数量单位;但是小数部分的每一个数字都要读出来,连续的零不可以读成一个零,而应该分别读出。

6.如果数中有小数点而没有小数部分,则不应该把小数点读出来。

例如,—0020030004.567应该读成“F2Q03W04D567”,000.89应该读成“0D89”。

请你编写程序帮助新牛把给定的数正确地读出来。

【输入格式】输入文件仅一行,存放了一个数(不超过50个字符),其绝对值小于10亿。

【输出格式】输出文件仅一行,输出这个数的正确读法。

【样例输入】-0020030004.567【样例输出】F2Q03W04D567弄了好几个小时,两个版本,把精简的奉上,详见代码注释。

期间使用了一个单位数组flag,数字数组a,标志数组b。

冲刺NOIP2010模拟试题与解析(一)

冲刺NOIP2010模拟试题与解析(一)

冲刺NOIP2010模拟试题与解析(一)题目(提高组时间:3个小时)难易指数:★★★1、淘汰赛制(elimination.pas/c/cpp)【问题描述】淘汰赛制是一种极其残酷的比赛制度。

2n名选手分别标号1,2,3,…,2n-1,2n,他们将要参加n轮的激烈角逐。

每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。

这样,每轮将淘汰一半的选手。

n轮过后,只剩下一名选手,该选手即为最终的冠军。

现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。

【输入文件】输入文件elimination.in。

第一行是一个整数n(l≤n≤l0),表示总轮数。

接下来2n行,每行2n个整数,第i行第j个是p ij(0≤p ij≤100,p ii=0,p ij+p ji=100),表示第i号选手与第j 号选手比赛获胜的概率。

【输出文件】输出文件elimination.out。

只有一个整数c,表示夺冠概率最大的选手编号(若有多位选手,输出编号最小者)。

【样例输入】20 90 50 5010 0 10 1050 90 0 5050 90 50 0【样例输出】1【数据规模】30%的数据满足n≤3;100%的数据满足n≤10。

2、种树(trees.pas/c/cpp)【问题描述】一条街的一边有几座房子。

因为环保原因居民想要在路边种些树。

路边的地区被分割成块,并被编号为l…n。

每个块的大小为一个单位尺寸并最多可种一棵树。

每个居民想在门前种些树并指定了三个号码b,e,t。

这三个数表示该居民想在b和e之间最少种t棵树。

当然,b≤e,居民必须保证在指定地区不能种多于地区被分割成块数的树,即要求t≤e-b+1,允许居民想种树的各自区域可以交叉。

出于资金短缺的原因,环保部门请你求出能够满足所有居民的要求,需要种树的最少数量。

NOIP复赛复习15反转问题与弹性碰撞

NOIP复赛复习15反转问题与弹性碰撞

#include<cstdio> #include<cstring> #include<algorithm> using name space std; int dir[25],f[25]; int main(){ while(~scanf("%d",&dir[0])){ int tmp=0,ans=20; memset(f,0,sizeof(f)); for(int i=1;i<20;i++)scanf("%d",&dir[i]); f[0]=1;tmp++; for(int i=1;i<20;i++){
memset(tmp,0,sizeof(tmp)); for(int j=0;j<n;j++){ tmp[0][j]=i>>j&1; } int t=cal(); if(t<cnt){ cnt=t; memcpy(ans,tmp,sizeof(tmp)); } } if(cnt==n*m+1){ printf("IMPOSSIBLE\n"); } else{ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ printf("%d%c",ans[i][j],j+1==n ? '\n':' '); } } }
POJ 3279 农夫约翰知道聪明的牛产奶多。于是为了提高牛的智商他准备了如下游戏。 有一个 M×N 的 格子,每个格子可以翻转正反面,它们一面是黑色,另一面是白色。黑色的格子翻转后就是 白色,白色的格子翻转过来则是黑色。游戏要做的就是把所有的格子都翻转成白色。不过因 为牛蹄很大,所以每次翻转一个格子时,与它上下左右相邻接的格子也会被翻转。因为翻格 子太麻烦了, 所以牛都想通过尽可能少的次数把所有格子都翻成白色。 现在给定了每个格子 的颜色,请求出用最小步数完成时每个格子翻转的次数。最小步数的解有多个时,输出字典 序最小的一组。解不存在的话,则输出 IMPOSSIBLE。

Noip2010提高组 第1题 translate 机器翻译

Noip2010提高组 第1题 translate 机器翻译

Noip2010提高组第1题translate 机器翻译【题意分析】现在要翻译一段文章,于是需要查词典。

而计算机拥有存储功能,可以减少一部分查询。

已知计算机内存可以存储m个单词,当要查询的单词在内存中时,可以不用去查词典。

当内存未满时,每查到一个新词,就会加入到内存中;当内存已满,查到的新词会加入到内存中,并把内存中的第一个单词顶出内存。

现要求出翻译一篇文章需要查询词典的次数。

【输入】3 7 第1行2个正整数m、n,表示内存长度及文章长度1 2 1 5 4 4 1 第2行n个非负整数,为文章的内容【输出】5 查询词典的次数【样例分析】整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:空:内存初始状态为空。

1.1:查找单词1 并调入内存。

2.1 2:查找单词2 并调入内存。

3.1 2:在内存中找到单词1。

4. 1 2 5:查找单词5 并调入内存。

5. 2 5 4:查找单词4 并调入内存替代单词1。

6. 2 5 4:在内存中找到单词4。

7. 5 4 1:查找单词1 并调入内存替代单词2。

共计查了5次词典。

【分析】本题就是一个简单的模拟:用队列q表示内存,l、r为内存的头、尾指针;用布尔数组f[i]表示i单词是否在数组中。

【代码】Program translate;Constinfile = 'translate.in';outfile = 'translate.out';Varf: Array[1..1000] Of Boolean;s, i, l, c, m, n, r: longint;q: Array[1..1000] Of Longint;BeginAssign(input, infile);Reset(input);Assign(output, outfile);Rewrite(output);ReadLn(m, n);Fillchar(f, Sizeof(f), False);s := 0;l := 1;r := 0;For i:=1 To n Do BeginRead(c);If f[c] Then Continue;Inc(r);q[r] := c;Inc(s);f[c] := True;If r - l + 1 > m Then Beginf[q[l]] := False;Inc(l);End;End;WriteLn(s);Close(input);Close(output);End.【总结】实在没什么好说的,只要仔细就不会错。

清北学堂NOIP2010模拟试题与详细解析(13)

清北学堂NOIP2010模拟试题与详细解析(13)

冲刺NOIP 2010模拟试题与解析(十三)一、防护伞【题目描述】据说2012的灾难和太阳黑子的爆发有关。

于是地球防卫小队决定制造一个特殊防护伞,挡住太阳黑子爆发的区域,减少其对地球的影响。

由于太阳相对于地球来说实在是太大了,我们可以把太阳表面看作一个平面,中心定为(0,0)。

根据科学家的情报,在2012年时,太阳表面上产生N个黑子区域,每一个黑子视为一个点。

特殊防护伞可以看作一个巨大的圆面,现在地球防卫小队决定将它的中心定位于某一个黑子,然后用伞面挡住其他黑子。

因为制造防护伞的材料成本特别高,所以我们希望伞面尽可能的小。

【输入格式】第1行:一个整数N,表示黑子个数。

第2..N-1行:每行两个整数,表示黑子的坐标(X,y)。

【输出格式】第1行:一个实数,表示伞的面积。

【输入样例】30 1-8 -4-1 4【输出样例】279.6017【数据范围】对于50%的数据:2≤N≤100。

对于100%的数据:2≤N≤1,000。

-10,000≤x,y≤10,000。

【注意】精确到小数点后4位。

Pi=3.1415926535二、外星密码【题目描述】有了防护伞,并不能完全避免2012的灾难。

地球防卫小队决定去求助外星种族的帮助。

经过很长时间的努力,小队终于收到了外星生命的回信。

但是外星人发过来的却是一串密码。

只有解开密码,才能知道外星人给的准确回复。

解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串“x”会压缩为“[DX]”的形式(D是一个整数且1≤D ≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类似于后面这种压缩之后再压缩的我们称之为二重压缩。

如果是“[2[2[2CB]]]",则是三重。

现在我们给你外星人发送的密码,请你对其进行解压缩。

【输入格式】第1行:一个字符串【输出格式】第1行:一个字符串【输入样例】AC[3FUN]【输出样例】ACFUNFUNFUN【数据范围】对于50%的数据:解压后的字符串长度在1,000以内,最多只有三重压缩。

湖南省长沙市第一中学-冲刺NOIP2010模拟试题

湖南省长沙市第一中学-冲刺NOIP2010模拟试题

冲刺NOIP2010模拟试题与解析(普及组复赛)湖南省长沙市第一中学周祖松一、数数(count.pas/c/cpp)【问题描述】小可可正在学习怎么用手指数数。

当爸爸问她“n(1 ≤ n ≤ 10)是多少”,小可可的回答就是竖起n个手指头。

为了让问题简单一些,爸爸告诉她正确的手指表示方式:(1)这个数可以用一只手或两只手表示;(2)如果这个数用两只手表示,大的数会先给出。

比如爸爸问她“4是多少”,小可可有3种表示方法:(1)一只手竖起出4个手指头;(可以是左手也可是右手,只算一种)(2)一只手竖起出3个手指头,另一只手竖起出1个手指头;(3)一只手竖起出2个手指头,另一只手竖起出2个手指头;你的任务是,对于爸爸的提问,确认小可可有几种正确的回答方法。

【输入】输入文件count.in共一行为一个1到10之间的整数。

【输出】输出文件count.out共一行为一个整数,表示方法总数。

【样例输入】4【样例输出】3二、分数树(fraction.pas/c/cpp)【问题描述】十九世纪的时候,Moriz Stern (1858)与Achille Brocot (1860)发明了“一棵树”。

据说,经由一些简单的规则而产生的这一棵树上,可以包含零以上所有的有理数。

这棵树看起来大致这样:你观察出规则了吗?首先,他们在第一列放两个“分数”,第一个是0 / 1,代表0;第二个是1 / 0,代表无穷大。

接着他们一列一列地产生这棵树,当他们要产生第k+1列的时候,就先把前k列所有的分数按照大小排成一列(假设有n个),在这些数之间会有n - 1个间隔,那么第k + 1列就准备产生n - 1个数,其值的分子恰好是左右两个数的分子的和、分母是左右两个数的分母的和。

例如,2 / 3,而它的2就是左边1 / 2的1和右边1 / 1的分子1相加的结果;而2 / 3的3,则是1 / 2的2加上1 / 1的分母1而得。

从这棵树中,我们可以看出,每个正的最简分数在这棵树中恰好出现一次,我们用字母“L”和“R”分别表示从树根(1 / 1)开始的一步“往左走”和“往右走”,则每一个数都可以由L和R 组成的序列表示。

noip问题求解试题及答案

noip问题求解试题及答案

noip问题求解试题及答案NOIP问题求解试题及答案试题一:字符串反转题目描述:给定一个字符串,请编写一个程序实现字符串的反转。

输入格式:输入包含一个字符串,字符串长度不超过100。

输出格式:输出反转后的字符串。

示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```试题二:寻找最大子数组和题目描述:给定一个整数数组,请找出该数组中连续子数组的最大和。

输入格式:第一行包含一个整数n,表示数组的长度;第二行包含n个整数,表示数组的元素。

输出格式:输出一个整数,表示最大子数组和。

示例:输入:5-2 -3 4 -1 2输出:6答案:```pythondef max_subarray_sum(nums):max_sum = nums[0]current_sum = nums[0]for i in range(1, len(nums)):current_sum = max(nums[i], current_sum + nums[i])max_sum = max(max_sum, current_sum)return max_sumn = int(input())nums = list(map(int, input().split()))print(max_subarray_sum(nums))```试题三:计算阶乘题目描述:给定一个非负整数n,请计算n的阶乘。

输入格式:输入包含一个非负整数n。

输出格式:输出一个整数,表示n的阶乘。

示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```试题四:判断素数题目描述:给定一个正整数n,请判断n是否为素数。

冲刺NOIP2010模拟试题十

冲刺NOIP2010模拟试题十

冲刺NOIP 2010 模拟试题(十)(普及组)1、手机(mobile.pas)【问题描述】一般的手机的键盘是这样的:12abc3def4ghi5jkl6mno7pqrs8tuv9wxyz*0#要按出英文字母就必须要按数字键多下。

例如要按出X就得按9两下,第一下会出w,而第二下会把w变成x。

0键按一下会出一个空格。

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。

【问题输入】一行一个句子,只包含英文小写字母和空格,且不超过200个字符。

【问题输出】一行一个整数,表示按键盘的总次数。

【样例输入】I have a dream【样例输出】23【数据范围】如题目所示2、数字积木(brick.pas)【问题描述】小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有积木排成一排,所形成的数目最大是多少呢?你的任务就是读入n个数字积木,求出所能形成的最大数。

【问题输入】第一行是一个整数n(n<=1000),接下来n行每行是一个正整数。

【问题输出】所能形成的最大整数。

【样例输入】313131343【样例输出】34313131【数据范围】30%的数据,n<=10,每个数<10^3。

50%的数据,n<=100。

100%的数据,n<=1000,每个数<10^200。

3、家族(family.pas)【问题描述】在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同的姓氏。

现在给你的岛上的地图有n行,每行有若干列,每个格子中要么是“”,表示大海,要么是“*”,表示河流或山丘,要么是小写字母,表示一户人家的姓氏。

【问题输入】第一行是个数字N,表示下面信息的行数。

接下来是N行字符,每行由小写字母和*号组成,有些行的最前面也可能包含若干连续的空格,表示这些区域是大海,每一行最多不超过200个字符。

noip普及组赛前冲刺资料

noip普及组赛前冲刺资料

数组一、数字数组ex1_1_1.pas级数求和(NOIP2002)【题目描述】已知:Sn=1+1/2+1/3+…+1/n。

显然对于任意一个数K,当n.足够大的时候,Sn大于K。

现给出一个整数K(1≤K≤15),要求计算出一个最小的n,使得Sn>K【输入】一行,一个整数K【输出】一行,一个整数n【输入样例】1【输出样例】2ex1_1_2.pas陶陶摘苹果(NOIP2005)【题目描述】陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。

苹果成熟的时候,陶陶就会跑去摘苹果。

陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。

假设她碰到苹果,苹果就会掉下来。

【输入】两行数据。

第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。

第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

【输出】一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

【输入样例】100 200 150 140 129 134 167 198 200 111110【输出样例】5ex1_1_3.pas数字统计(NOIP2010)【题目描述】请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。

比如给定范围[2, 22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6次。

【输入】共1 行,为两个正整数L 和R,之间用一个空格隔开。

【输出】共1 行,表示数字2 出现的次数。

【输入样例】2 22【输出样例】6【输入输出样例2】2 100【输出】20【数据范围】1 ≤ L ≤ R≤ 10000。

NOIP2010 题解

NOIP2010 题解

1.#include <stdio.h>2.#include <stdlib.h>3.4.#define IN_FILE_NAME "translate.in"5.#define OUT_FILE_NAME "translate.out"6.7.int iMaxMem = 0,iWordNum = 0;8.int Mem[100],Word[1000];9.int iOut = 0,iMemLen = 0;10.11.void DeleteWord()12.{13.for (int i = 0; i < iMemLen;i++)14. {15. Mem[i] = Mem[i+1];16. }17. iMemLen --;18.}19.20.void InMem(int iWord)21.{22.if(iMemLen + 1 >iMaxMem)23. DeleteWord();24. Mem[iMemLen] = iWord;25. iMemLen ++;26.}27.28.void ReadFile()29.{30.int i = 0;31.FILE *fp = fopen(IN_FILE_NAME,"rb");32.if (fp == NULL)33. {34.return;35. }36. fscanf(fp,"%d%d",&iMaxMem,&iWordNum);37.for (i = 0;i < iWordNum;i++)38. {39. fscanf(fp,"%d",&Word[i]);40. }41. fclose(fp);42.}43.44.45.void WriteFile()46.{47.int i = 0;48.FILE *fp = fopen(OUT_FILE_NAME,"wb");49.if (fp == NULL)50. {51.return;52. }53. fprintf(fp,"%d",iOut);54. fclose(fp);55.}56.57.int IsWordInMem(int iWord)58.{59.for (int i = 0;i<iMaxMem;i++)60. {61.if(Mem[i] == iWord)62. {63.return 1;64. }65. }66.return 0;67.}68.69.void ScanWord()70.{71.int i = 0;72.for (i=0;i<iWordNum;i++)73. {74.if (IsWordInMem(Word[i]) == 0)75. {76. iOut ++;77. InMem(Word[i]);78. }79. }80.81.}82.83.int main()84.{85. ReadFile();86. ScanWord();87. WriteFile();88.return 0;89.}#include<iostream>using namespace std;int f[41][41][41][41];int s[351];int main(){intn,m,x;cin>>n>>m;int a=0,b=0,c=0,d=0;for(inti=0;i<n;i++)cin>>s[i];for(inti=1;i<=m;i++){cin>>x;if(x==1)a++;if(x==2)b++;if(x==3)c++;if(x==4)d++;}for(inti=0;i<=a;i++)for(int j=0;j<=b;j++)for(int k=0;k<=c;k++)for(int l=0;l<=d;l++){if(i!=0)f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]);if(j!=0)f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]);if(k!=0)f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]);if(l!=0)f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]);f[i][j][k][l]+=s[i+j*2+k*3+l*4];cout<<f[a][b][c][d];return 0;}关押罪犯此题各种做法都有,但最简单的方法还是并查集。

NOIP2010冲刺前夕体验赛

NOIP2010冲刺前夕体验赛

NOIP2010冲刺前夕体验赛题1:三角形(triangle.pas)liuichou和royZhang都是近视眼,经常看错题目(有逻辑关联吗)。

这次数学考试,他们又犯了低级错误。

好在可以编写一个程序来解决一部分的问题。

一个由大写字母组成的方阵里面可能包含一些等腰直角三角形。

这次他们要数出方阵中由各种字母组成的等腰直角三角形的数目,以及等腰直角三角形的总数,而你的任务是写一个程序来统计。

方阵中的等腰直角三角形只有下面两种情况:1、两条直角边分别跟方阵的边平行,例如:2、等腰直角三角形的斜边与方阵的边平行,例如:每个等腰直角三角形都不能少于3个字母。

输入格式triangle.in文件的第一行是一个整数N(0<N<=100),接下来总共有N行,每行有N个大写字母,描述的是一个N*N的大写字母方阵。

行首与行末没有多余的空格。

输出格式triangle.out第一行输出方阵中总共有多少个等腰直角三角形。

然后对方阵中出现的每个字母,求出由它所组成的等腰直角三角形的个数,并按照字典顺序逐行输出。

输入样例I3AABABBBBC输出样例I4A1B3C0输入样例II4AABBABBBBBBBBBBB输出样例II51A1B50题2:公司聚会(cparty.pas)dd_engi所在的TIANYI公司要举办一次盛大的公司聚会。

可惜的是,由于场地和花费的原因,不可能所有人都参加。

现在的任务是拟定参加聚会人员的名单。

TIANYI公司的组织架构可以看做一棵有根多叉树。

也就是说,在编号为1~N的所有N 名员工中,除了最高管理者(编号为1)以外,每个员工都有且仅有一位直接上司;最高管理者则是这棵多叉树的“根”。

这很好理解,对吗?另外,我们保证,员工的编号会大于他的直接上司的编号。

不同的员工对于聚会有着不同的要求,事实上,若邀请第i位员工(编号为i),在聚会中满足他的要求需要花费C i元。

另一方面,不同的员工在聚会中的“兴奋指数”也不同,第i位员工参加聚会的兴奋指数是E i。

《NOI导刊》2010年暑期培训模拟试题

《NOI导刊》2010年暑期培训模拟试题

《NOI导刊》2010年暑期培训模拟试题Encrypt为了防止文本机密被泄漏,某A发明了一种加密系统。

把它还原成原始文本。

输入格式第一行,依次进行的加密操作代号。

第二行,接收到的文件。

输出格式只有一行,原始文件。

样例输入AM6输出7数据范围1<=加密操作序列长度<=61<=每个文本的长度<=25Count我们已经知道这样一个定理:任意一个正整数能够分解成最多4个数字的平方和。

现在给你一些数字,要你求出它们有多少种不同的分解方法,使得分解出来的数字个数小于等于4,并且它们的平方和等于该数字。

比如:25一共有3种不同的分法:12+22+22+42,32+42,52。

(注意:32+42与42+32算同一种。

)输入格式一个数字N。

输出格式一行,对应该数字的分解方法数。

样例输入25输出3数据范围1<=N<=2^15GapGap是一种纸牌游戏。

纸牌有花色,标号1~4,每种花色有7个数字,分别是1~7。

每张牌的编号就是花色+数字。

现在有一张4*8的网格,把这28张牌放入网格中。

下面开始进行移动操作,首先把每种花色的1放到对应每行最前面的空列,如下:接下来的操作,每次可以找空格的左边与其同色的后继放在此空格。

比如可以选择43放到42右边,但是27没有后继所以没有纸牌能够放到27右边的空格,27右边的右边的空格,因为左边没有纸牌所以同样不能放上纸牌。

现在给你初始状态,求最少的移动次数使得它达到目标状态。

(我们所说的移动次数,并不包括最初把各个花色的1移动到最前面的4步)输入格式4行7列,表示初始状态。

输出格式一个数,答案,如果无解则输出-1。

样例输入26 31 13 44 21 24 4217 45 23 25 41 36 1146 34 14 12 37 32 4716 43 27 35 22 33 15输出33Molecular给你一些原子的质量,请你计算他们所构成的分子式质量。

[新版]noip2010普及组满分题解

[新版]noip2010普及组满分题解

【个人题解+代码】NOIP2010 普及组首先前两题可以说非常水,第三题也是水题。

第四题难度和前三题差别有点大……1.数字统计(two.pas/c/cpp)【问题描述】请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。

比如给定范围[2, 22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6次。

【输入】输入文件名为two.in。

输入共1 行,为两个正整数L 和R,之间用一个空格隔开。

【输出】输出文件名为two.out。

输出共1 行,表示数字2 出现的次数。

【输入输出样例1】【输入输出样例2】【数据范围】1 ≤ L ≤ R≤ 10000。

直接上题解:T1:two大水题,主要有如下几种方法:1.用字符串处理2.每次用mod10取最后一位再div103.递推递推式f[i]=f[i div 10]+f[i mod 10]然后累加即可(我是用这个做的)4.分别用数学公式计算每一位上2的个数(最快,但没必要,代码也较长)……var0000f:array[0..10000] of longint;0000l,r,i,ans:longint;000begin000assign(input,'two.in');reset(input);000assign(output,'two.out');rewrite(output);000read(l,r);000f[2]:=1;000for i:=10to r do0000f[i]:=f[i div10]+f[i mod10];0000for i:=l to r do0000inc(ans,f[i]);000writeln(ans);000close(input);close(output);000end.2.接水问题(water.pas/c/cpp)【问题描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广度搜素
int bfs(){ if (sbegin==0 || sbegin==send) return 0;//如果给定的状态就已经实现了目标就输出0 for (unsigned int head=0; deq.size()<65536 && head<deq.size();){ //如果队列空或所有状态都出现了结束,没有答案 for (int i=0;i<16;i++){ // 先任选一个位置待翻转 unsigned int now=deq[head]; //取队头元素 for (int j=0;j<5;j++){ //分别对第i个位置及其上下左右的位置翻转 int xx=i/4+fa[j][0],yy=i%4+fa[j][1]; if (xx>=0 && xx<4 && yy>=0 && yy<4 ) now^=(dig[i+fa[j][2]]); } if (now==0 || now==send) return(deq1[head]+1); // 到目标 if (flag[now])continue; // 如果重复则舍弃,否则入队并设置标志 deq.push_back(now); deq1.push_back(deq1[head]+1); flag[now]=true; } head++; } return(-1); }
翻转游戏
题目描述

长方形上进行的,在长方形的16个格上每个格子都 放着一个双面的物件。每个物件的两个面,一面是白色,另一面是黑色,每个物 件要么白色朝上,要么黑色朝上,每一轮你只能翻3至5个物件,从而由黑到白的 改变这些物件上面的颜色,反之亦然。每一轮被选择翻转的物件遵循以下规则: 1、从16个物件中任选一个。 2、翻转所选择的物件的同时,所有与它相邻的左方物件、右方物件、上方物件 和下方物件(如果有的话),都要跟着翻转。 以下为例: bwbw wwww bbwb bwwb 这里"b"表示该格子放的物件黑色面朝上、"w"表示该格子放的物件白色朝上。 如果我们选择翻转第三行的第一个物件,那么格子状态将变为: bwbw bwww wwwb wwwb 游戏的目标是翻转到所有的物件白色朝上或黑色朝上。你的任务就是写一个程 序来求最少的翻转次数来实现这一目标。
输入输出样例
输入样例 bwwb bbwb bwwb bwww 输出样例 4

算法分析:




求最少步数,广度搜索+位运算 将长方形数字化(b为0,w为1); 输入样例 bwwb bbwb bwwb bwww 转化为unsigned int sbegin=(0110 0010 0110 0111)2 各位对应权值(由高位到低位)为 dig{32768,16384,8192,4096,2048,1024,512,256,128, 64,32,16,8,4,2,1) 对x的第i位(从高位到低位0~15)取反为 x^dig[i] ,即异或运算
主程序
#include <fstream> #include <string> #include <vector> using namespace std; ifstream fin("flip.in"); ofstream fou("flip.out"); int main(){ init(); ans=bfs(); if (ans>-1) fou<<ans<<endl; else fou<<"Impossible"<<endl; return 0; }
输入输出格式


输入格式 输入文件flip.in包含4行,每行4个字符,每个 字符"w" 或 "b"表示游戏开始时格子上物件的状 态。 输出格式 输出文件flip.out仅一个整数,即从给定状态 到实现这一任务的最少翻转次数。如果给定的状 态就已经实现了目标就输出0,如果不可能实现目 标就输出"Impossible"。
数据结构
unsigned int sbegin=0,send=0x0000ffff,dig[16]; //dig[i]为第i位的权值,dig[0]为最高位。 int fa[5][3]={{0,0,0},{0,-1,-1},{0,1,1},{-1,0,4},{1,0,4}};// 翻动方案 bool flag[66000]={0};//判重标志数组最大65535 vector <unsigned int> deq;//广搜队列 vector <int> deq1; //deq1[i]为deq[i]的深度,即步数 int ans=0;
初始化
void init(){ string str; for (int i=0;i<4;i++){ fin>>str; for (int j=0;j<4;j++) sbegin=(sbegin<<1)+(str[j]=='b'?0:1); } //将长方形数字化b为0,w为1; dig[15]=1; for (int i=14;i>=0;i--) dig[i]=dig[i+1]<<1;//求各位的权值 deq.push_back(sbegin);//队列初始化, deq1.push_back(0); flag[sbegin]=true; }
相关文档
最新文档