NOIP 2011 提高组day1 题解 美少女战士原创

合集下载

全国信息学联赛(NOIP)模拟试题-一试

全国信息学联赛(NOIP)模拟试题-一试

全国信息学奥林匹克联赛(NOIP2011)复赛提高组模拟模拟试题试题试题(一试)(一试)(请选手务必仔细阅读本页内容)一.题目概况中文题目名称订正作业怪兽对对碰采油区域英文题目与子目录名correct monster oil 可执行文件名correct monster oil 输入文件correct.in monster.in oil.in 输出文件correct.out monster.out oil.out 每个测试点时限1秒1秒 1.5秒测试点数目101010每个测试点分值101010附加样例文件有有有结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统二.提交源程序文件名三.运行内存限制对于pascal 语言correct.pas ball.pas .pas 对于C 语言correct.c ball.c .c 对于C++语言correct.cppball.cpp.cpp内存上限128M128M128M1.订正作业(correctcorrect.pas/c/cpp).pas/c/cpp)【问题描述】丁丁是个富有爱心的哥哥。

他上小学的弟弟小丁丁刚刚学习了四则运算,并做了作业。

现在小丁丁把自己的作业给了丁丁,请他帮忙检查订正一下作业。

作业题都是一些含有括号的四则运算等式。

丁丁发现他的弟弟对于括号的使用不太明白,在作业中写了不少多余的括号。

现在丁丁的任务是找出这些多余的括号,并把他们擦去。

但是为了尽可能避免自己的笔迹出现,只能改动括号。

要求保持原表达式中变量和运。

另外,由于弟弟在上小学,不必考虑“+”“-”作为正负号的情况。

即输入的表达式中”“-”用于“+X”(正数)或是“-X”(负数)的情况。

也不必考虑式子中有超过20输入文件名为correct.in。

第一行为一个正整数n,表示作业题的数量。

接下来的n行,每行有n个含括号的等式,表示待丁丁订正的作业题。

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

NOIP2011模拟试题及解析

NOIP2011模拟试题及解析

NOIP2011模拟试题及解析128MClass(class.pas/c/cpp)【问题描述】信息班这期的课将要结束了,老师要从现在班上的同学中选出比较优秀的同学进入下一期的学习。

而录取标准则是将平时作业和考试一起考虑,综合成绩排在前面的则录取。

经过一番思考,老师作了以下的筛选计划:1、设计两个参数x,y,学生总成绩为平时成绩的x%和考试成绩的y%。

2、将同学按总成绩排名,招收总成绩在前15的学生,不够15则全部录取。

注:总成绩在第15的如果有多人,则可以被同时录取。

例如:18个人总成绩从大到小依次为95,93,93,88,87,84,80,75,70,68,66,65,60,58,57,57,56,55。

那么93,93同为第2名,而88为第4名,57,57同为第15名,都被录取。

而56,55则不被录取。

老师因为招生培训的事情很忙,所以现在她把信息班学生的成绩表给了你,希望你能告诉她哪些同学被录取了。

【输入】输入文件class.in第一行有三个数N,x,y。

表示信息班有N个同学以及参数x,y。

第二行N个数,分别为A1,A2,A3 … AN。

Ai表示编号为i的同学的平时成绩。

第三行N个数,分别为B1,B2,B3 … BN。

Bi表示编号为i的同学的考试成绩。

【输出】输出文件class.out共一行,为被录取同学的编号,按照升序输出。

【输入输出样例】【数据说明】1<=N<=1000<=x,y<=1000<=平时成绩,考试成绩<=100以上数据皆为整数模拟。

首先求出所有人的总分,然后进行快排(注意第15名的并列情况),人数小于15时,输出1到n;否则将入围人员的编号进行排序升序输出。

程序如下:program zk;varp,k,h,zong:array [0..200] of longint;i,j,a,b,c,n,x,y,xian,f:longint;procedure qsort(x,y:longint);varxo,yo,zz,mid,z:longint;beginxo:=x; yo:=y;mid:=zong[(xo+yo) div 2];repeatwhile zong[xo]>mid do inc(xo);while zong[yo]<mid do dec(yo);if xo<=yo thenbeginz:=zong[xo];zong[xo]:=zong[yo];zong[yo]:=z;zz:=h[xo];h[xo]:=h[yo];h[yo]:=zz;inc(xo); dec(yo);end;until xo>yo;if x<yo then qsort(x,yo);if xo<y then qsort(xo,y);end;procedure qsorth(x,y:longint); varxo,yo,zz,mid,z:longint;beginxo:=x; yo:=y;mid:=h[(xo+yo) div 2]; repeatwhile h[xo]<mid do inc(xo);while h[yo]>mid do dec(yo);if xo<=yo thenbeginzz:=h[xo];h[xo]:=h[yo];h[yo]:=zz;inc(xo); dec(yo);end;until xo>yo;if x<yo then qsorth(x,yo);if xo<y then qsorth(xo,y); end;beginassign(input,'class.in'); assign(output,'class.out'); reset(input);rewrite(output);readln(n,x,y);for i:=1 to n doread(p[i]);readln;for i:=1 to n dobeginh[i]:=i;read(k[i]);end;for i:=1 to n dozong[i]:=p[i]*x+k[i]*y;qsort(1,n);xian:=15;if n>=15 thenbeginf:=zong[xian];while zong[xian+1]=f doxian:=xian+1;endelse xian:=n;qsorth(1,xian);for i:=1 to xian dowrite(h[i],' ');close(input);close(output);end.Clean(clean.pas/c/cpp)【问题描述】最近甲型H1N1流感病毒肆虐。

2011十七届noip提高组题目及答案

2011十七届noip提高组题目及答案

第十七届全国青少年信息学奥林匹克联赛初赛试题(提高组 Pascal语言两小时完成)一、单项选择题(共20题,每题1.5分。

共计30分。

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

)1.在二进制下, +()= 。

A.1011 B.1101 C.1010 D.11112.字符“A”的ASCII码为十六进制41,则字符“Z”的ASCII码为十六进制的()。

A.66 B.5A C.50 D.视具体的计算机而定3.右图是一棵二叉树,它的先序遍历是()。

A.ABDEFC B.DBEFAC C.DFEBCA D.ABCDEF4.寄存器是()的重要组成部分。

A.硬盘B.高速缓存C.内存D.中央处理器(CPU)5.广度优先搜索时,需要用到的数据结构是()。

A.链表B.队列C.栈D.散列表6.在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指()。

A.程序运行时理论上所占的内存空间B.程序运行时理论上所占的数组空间C.程序运行时理论上所占的硬盘空间D.程序源文件理论上所占的硬盘空间7.应用快速排序的分治思想,可以实现一个求第K大数的程序。

假定不考虑极端的最坏情况,理论上可以实现的最低的算法时间复杂度为()。

A.O(n2)B.O(n log n)C.O(n) D.O(1)8.为解决Web应用中的不兼容问题,保障信息的顺利流通,()制定了一系列标准,涉及HTML、XML、CSS等,并建议开发者遵循。

A.微软 B.美国计算机协会(ACM) C.联台国教科文组织D.万维网联盟(W3C)9.体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。

每个同学按顺序来到操场时,都从排尾走向排头,找到第一个比自己高的同学,并站在他的后面。

这种站队的方法类似于()算法。

A.快速排序B.插入排序C.冒泡排序D.归并排序10.1956年()授予肖克利(William Shockley)、巴丁(John Bardeen)和布拉顿(Walter Brattain),以表彰他们对半导体的研究和晶体管效应的发现。

冲刺NOIP2011模拟试题一

冲刺NOIP2011模拟试题一

冲刺NOIP2011模拟试题1.单词分类(word.c/cpp)[问题描述]Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类。

两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。

例如“AABAC”,它和“CBAAA”就可以归为一类,而和“AAABB”就不是一类。

现在Oliver有N个单词,所有单词均由大写字母组成,每个单词的长度不超过100。

你要告诉Oliver 这些单词会被分成几类。

[输入格式]输入文件的第一行为单词个数N,以下N行每行为一个单词。

[输出格式]输出文件仅包含一个数,表示这N个单词分成的类数。

[样例输入]3AABACCBAAAAAABB[样例输出]2[数据范围]对于70%的数据满足N≤100。

对于100%的数据满足N≤10000。

2.过河问题(river.c/cpp)[问题描述]有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸。

而东岸边有一条小船。

船太小了,一次只能乘坐两人。

每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间。

现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河。

注意,只有船在东岸(西岸)的人才能坐上船划到对岸。

[输入格式]输入文件第一行为人数N,以下有N行,每行一个数。

第i+1行的数为第i个人的渡河时间。

[输出格式]输出文件仅包含一个数,表示所有人都渡过河的最少渡河时间。

[样例输入]4671015[样例输出]42[样例解释]初始:东岸{1,2,3,4},西岸{}第一次:东岸{3,4},西岸{1,2} 时间7第二次:东岸{1,3,4},西岸{2} 时间6第三次:东岸{1},西岸{2,3,4},时间15第四次:东岸{1,2},西岸{3,4} 时间7第五次:东岸{},西岸{1,2,3,4} 时间7所以总时间为7+6+15+7+7=42,没有比这个更优的方案。

杭州学军中学NOIP2011模拟赛DAY2-2011-10-5题解

杭州学军中学NOIP2011模拟赛DAY2-2011-10-5题解

NOIP2011模拟赛题解最大公约数首先可以排除所有GCD(a,b)不等于1的数对因为他们同除以公约数后可以得到一样优的解其次可以排除在辗转过程中出现a<=b div2的情况如果b mod a=c可以将b变成a+c可以得到一样优的解并且原来的b变小则可以将所有没被排除掉的数表示成如下形式a,b->b-a,a->….->1,x(经过L次)对于所有的1,x明显x=2得到的序列更优所以只考虑这个序列1,2->2,3->3,5->5,8->8,13….即由Fibonacci数列前后两项所构成的序列做法:用高精度计算fib数列知道列尾数字大于n输出倒数第二和倒数第三项即可序列游戏如果我们枚举Gy,Nsk翻转的位置,然后再进行计算,显然是O(N^3)的。

这个做法通过记录区间和能够非常容易的做到O(N^2),但如果要通过所有的测试数据还有一定困难。

因此我们接下来对这题作一些研究。

显然的,假如Gy的决策已经确定了,Nsk的决策是确定的。

我们猜想这之中有一定的单调性,但是显然Nsk的决策和Gy的决策构不成单调关系。

事实上,要处理原问题,我们只需要解决下面的两个子问题即可。

1.Gy和Nsk的选择集合严格不相交。

2.Gy和Nsk的选择集合存在相交部分。

这两个子问题都是可以做的。

我们先来考虑第一个子问题。

如果Gy和Nsk的选择集合严格不相交的话怎么处理。

显然这个问题可以通过记录后缀最小值单调处理,时间复杂度O(N)。

如果Gy和Nsk的选择集合存在相交部分,假设Gy当前决策是i,Nsk相对的最优决策是j(j<=i),我们记这样的决策为(i,j)。

显然Nsk的最优决策不会在[0,j-1],因为这与(i,j)为Nsk在i处的最优决策相矛盾。

同理最优决策不会在[j+1,i]。

因此,当Gy的决策由i变成i+1时,实际上Nsk下一步只有两种决策的可能1.Nsk的决策仍为j;2.Nsk的决策变为i+1。

NOIP2011 提高组 试题 Day2

NOIP2011 提高组 试题 Day2
【数据范围】 对于 10%的数据,k=0; 对于 20%的数据,k=1;
对于 40%的数据,2 ≤ n ≤ 50,1 ≤ m ≤ 1,000,0 ≤ k ≤ 20,0 ≤ Di ≤ 10,0 ≤ Ti ≤ 500; 对于 60%的数据,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100,0 ≤ Di ≤ 100,0 ≤ Ti ≤ 10,000; 对于 100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100, 0 ≤ Ti ≤ 100,000。
对于 C 语言
factor.c
对于 pascal 语言
factor.pas
qc.cpp qc.c
qc. Pas
bus.cpp bus.c bus. pas
三.编译命令(不包含任何优化开关)
对于 C++语言
g++ -o factor
g++ -o qc qc.cpp
factor.cpp -lm
–lm
对于 C 语言
第1页共4页
全国信息学奥林匹克联赛(NOIP2011)复赛
提高组 day2
1.计算系数
【问题描述】
(factor.cpp/c/pas)
给定一个多项式 (ax + by)k ,请求出多项式展开后 xn y m 项的系数。
【输入】 输入文件名为 factor.in。 共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。
往第 i+1 个景点所需要的时间,即 Di。 第 3 行至 m+2 行每行 3 个整数 Ti, Ai, Bi,每两个整数之间用一个空格隔开。第 i+2 行表

2011noip提高组复赛题解

2011noip提高组复赛题解

Noip 2011 提高组(Day 1)解题报告及程序一、铺地毯正着扫一遍判断每个矩形是否覆盖询问的点,覆盖则更新结果或者倒着扫一遍,找到第一个覆盖询问点的矩形,输出即可,时间复杂度O(n)Procedure:#include <cstdio>#define MaxLength 10000inline int Getint(){char c = getchar();while (c<'0' || c>'9') c = getchar();int ret = 0;while (c>='0' && c<='9'){ret = ret*10 + (c-'0');c = getchar();}return ret;}int sx[MaxLength+5], sy[MaxLength+5], ex[MaxLength+5], ey[MaxLength+5], n; void Init(){n = Getint();for (int i=1; i<=n; i++){sx[i] = Getint(), sy[i] = Getint(), ex[i] = Getint(), ey[i] = Getint();ex[i] += sx[i], ey[i] += sy[i];}return ;}int x0, y0, ans = -1;void Solve(){x0 = Getint(), y0 = Getint();for (int i=n; i;i--)if(x0>=sx[i] && x0<=ex[i] && y0>=sy[i] && y0<=ey[i]){ans = i;break;}printf("%d", ans);return ;}int main(){Init();Solve();getchar(); getchar();return 0;}二、选择客栈f [i][j]表示前i个客栈以第j种颜色的方案数,先以客栈划分第一阶段,以颜色划分第二阶段,如果颜色相同的客栈,则以前一客栈相同颜色的方案数+1,否则同其一样;计算答案时记一下前一个比最高消费限制低的客栈编号pos[i],路径压缩,时间复杂度O(nm)Procedure:#include <cstdio>#define MaxNode 200000#define MaxType 50inline int Getint(){char c = getchar();while (c<'0' || c>'9') c = getchar();int ret = 0;while (c>='0' && c<='9'){ret = ret*10 + (c-'0');c = getchar();}return ret;}int color[MaxNode+5], price[MaxNode+5], n, m, low;void Init(){n = Getint(), m = Getint(), low = Getint();for (int i=1; i<=n; i++) color[i] = Getint(), price[i] = Getint();return ;}int f[MaxNode+5][MaxType+5], pos[MaxNode+5], ans = 0;void Dp(){for (int i=1; i<=n; i++)for (int j=0; j<m; j++)if (color[i]==j) f[i][j] = f[i-1][j]+1;else f[i][j] = f[i-1][j];for (int i=1; i<=n; i++)if (price[i]<=low){pos[i] = i;ans += f[i-1][color[i]];}else{pos[i] = pos[i-1];ans += f[pos[i]][color[i]];}printf("%d", ans);return ;}int main(){Init();Dp();getchar(); getchar();return 0;}三、Mayan纯暴力DFS,加可行性剪枝,如同一种颜色小于3块无法消除,同一颜色交换无意义,下落无法完成左右移动,再加模拟其过程时间复杂度O( n^(?) )Procedure:#include <cstdio>#include <memory>inline int Getint(){char c = getchar();while (c<'0' || c>'9') c = getchar();int ret = 0;while (c>='0' && c<='9'){ret = ret*10 + (c-'0');c = getchar();}return ret;}inline void Swap(int &a, int &b){int temp = a; a = b; b = temp;return ;}int map[10][10], point[10], color[15], n, type = 0;void Init(){n = Getint();for (int i=0; i<5; i++){map[i][0] = Getint();if (type<map[i][point[i]]) type = map[i][point[i]];color[ map[i][point[i]] ]++;while (map[i][point[i]]){map[i][++point[i]] = Getint();if (type<map[i][point[i]]) type = map[i][point[i]];color[ map[i][point[i]] ]++;}point[i]--;}return ;}bool Fall(int k){int top = -1;for (int i=0; i<=point[k]; i++)if (map[k][i]) map[k][++top] = map[k][i];if (top!=point[k]){for (int i=top+1; i<=point[k]; i++) map[k][i] = 0;point[k] = top;return true;}return false;}bool Check_Fall(){bool flag = false;for (int i=0; i<5; i++)if (Fall(i)) flag = true;return flag;}bool sign[10][10];void Clear(){int pmax = 0;for (int i=0; i<5; i++)if (point[i]>pmax) pmax = point[i];for (int i=0; i<5; i++)if (point[i]>=2){int k = point[i], j = k-1;for (; j>=0; j--)if (map[i][j]!=map[i][k]){if (k-j>=3)for (; k>j; k--) sign[i][k] = true;else k = j;}if (k-j>=3)for (; k>j; k--) sign[i][k] = true;}for (int i=0; i<=pmax; i++){int k = 0, j = 1;for (; j<5; j++)if (map[j][i]!=map[k][i]){if (j-k>=3)for (; k<j; k++) sign[k][i] = true;else k = j;}if (j-k>=3)for (; k<j; k++) sign[k][i] = true;}for (int i=0; i<5; i++)for (int j=pmax; j>=0; j--)if (sign[i][j]){sign[i][j] = false;color[map[i][j]]--;map[i][j] = 0;}return ;}void Solve(int x, int y){Fall(x), Fall(y);Clear();while (Check_Fall()) Clear();return ;}bool Check_Point(){for (int i=0; i<5; i++)if (point[i]>=0)return false;return true;}bool Check_Color(){for (int i=1; i<=type; i++)if (color[i]==1 || color[i]==2) return false;return true;}struct Ac{int m[10][10], p[10], c[15];}a[10];inline void Copy(int k){memcpy(a[k].m, map, sizeof(map));memcpy(a[k].p, point, sizeof(point));memcpy(a[k].c, color, sizeof(color));return ;}inline void Turn_Copy(int k){memcpy(map, a[k].m, sizeof(a[k].m));memcpy(point, a[k].p, sizeof(a[k].p));memcpy(color, a[k].c, sizeof(a[k].c));return ;}int ans[10][10];bool Dfs(int deep){if (!Check_Color()) return false;Copy(deep);for (int i=0; i<5; i++)for (int j=0; j<=point[i]; j++){ans[deep][0] = i, ans[deep][1] = j;if (i<4){ans[deep][2] = 1;Swap(map[i][j], map[i+1][j]);if (point[i+1]<j) point[i+1] = j;Solve(i, i+1);if (deep==n && Check_Point()) return true;if (deep<n && Dfs(deep+1)) return true;Turn_Copy(deep);}if (i && point[i-1]<j){ans[deep][2] = -1;Swap(map[i][j], map[i-1][j]);point[i-1] = j;Solve(i, i-1);if (deep==n && Check_Point()) return true;if (deep<n && Dfs(deep+1)) return true;Turn_Copy(deep);}}return false;}int main(){Init();if (!Dfs(1)) printf("-1");elsefor (int i=1; i<=n; i++)printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);getchar(); getchar();return 0;}Noip 2011 提高组(Day 2)解题报告及程序一、计算系数二项式定理,杨辉三角,注意Mod就可以了,时间复杂度O(k^2)Procedure:#include <cstdio>#define MaxNode 1000#define Mod 10007int f[MaxNode+5][MaxNode+5], a, b, k, n, m;void Init(){scanf("%d %d %d %d %d", &a, &b, &k, &n, &m);a %= Mod,b %= Mod, k++;for (int i=1; i<=k; i++) f[i][1] = f[i][i] = 1;for (int i=2; i<=k; i++)for (int j=2; j<i; j++)f[i][j] = (f[i-1][j-1] + f[i-1][j])%Mod;return ;}void Solve(){int x = k, y = k-n;for (int i=1; i<=n; i++) f[x][y] = (f[x][y] * a)%Mod;for (int j=1; j<=m; j++) f[x][y] = (f[x][y] * b)%Mod;printf("%d", f[x][y]%Mod);return ;}int main(){Init();Solve();getchar(); getchar();return 0;}二、聪明的质检员由观察得随着参数W的上升检验值temp会减小,据函数Abs(标准值-temp)有最小值,故可二分查找得出答案其中每次调整参数W时扫描一次矿石中大于W的,num[]表示其数量前缀和,val[]表示其价值前缀和,故可在一个区间的检验值计算中以O(1)的时间得出答案时间复杂度O(log(w)*(n+m))Procedure:#include <cstdio>#define MaxNode 200000#define INF ((0x7fffffffffffffffll)>>1)inline int Getint(){char c = getchar();while (c<'0' || c>'9') c = getchar();int ret = 0;while (c>='0' && c<='9'){ret = ret*10 + (c-'0');c = getchar();}return ret;}long long Abs(long long a){if (a>0) return a;return -a;}int w[MaxNode+5], val[MaxNode+5], l[MaxNode+5], r[MaxNode+5], n, m, lw, rw; long long standard;void Init(){n = Getint(), m = Getint(), scanf("%I64d", &standard);for (int i=1; i<=n; i++){w[i] = Getint(), val[i] = Getint();if (rw<w[i]) rw = w[i]+1;}for (int i=1; i<=m; i++) l[i] = Getint(), r[i] = Getint();return ;}int num[MaxNode+5];long long sum[MaxNode+5];long long Calc(int left, int right){return (sum[right]-sum[left]) * (num[right]-num[left]);}long long Sieve(int Limit){long long ret = 0;sum[0] = num[0] = 0;for (int i=1; i<=n; i++){num[i] = num[i-1];sum[i] = sum[i-1];if (w[i]>=Limit){num[i]++;sum[i] += val[i];}}for (int i=1; i<=m; i++) ret += Calc(l[i]-1, r[i]);return ret;}long long ans = INF;void Binary_Search()while (lw<rw){int mid = (lw+rw)>>1;long long temp = Sieve(mid);long long value = Abs(standard - temp);if (temp<standard) rw = mid;else lw = mid+1;if (ans>value) ans = value;}printf("%I64d", ans);return ;}int main(){Init();Binary_Search();getchar(); getchar();return 0;}三、观光公交贪心令t[i]表示当前到达第i个站的时间,sumoff[i]表示目的地为i的乘客数,arrtime[i]表示第i个乘客到站等车的时刻题目给定加速器的作用就是可以把某个t[i]减去1并把与其相关联的t[i]全部减小1。

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

NOIP 提高组初赛历年试题及答案阅读题篇程序写果(共 4 ,每 8 分,共 32 分)程序的最好方法并非是依次从到尾。

程序不像迷,我无法从末尾几找到答案,也不像一本引人入的籍,只需直接翻到褶最多的那几,我就能找到最精彩的片断。

因此我在程序,最好逐一考察研究每一段代,搞清楚每一段代的来去脉,理解每一段代在程序中所起的作用,而形成一个虚的程序构,并以此基来行。

1、分:高入手,逐深入,正确理解程序。

2、写注解:固化、、提已有的理解成果。

3、先模:根据代序跟踪量,模运算。

4、找律:先模几次循后,找出背后的律。

5、看功能:从代构和运算果判断程序功能。

6、猜算法:有不知道算法,通构和函数猜一猜。

7、方法:了解程序本后,一个熟悉的方法。

大多数人来,写程序是令人开心的一件事情,人的程序却很痛苦,很恐惧,宁愿自己重写一遍。

其到好的程序,就像一篇美文,令人心神怡,豁然开朗,因背后是一个人的思,甚至整个人生。

人的程序不可以巩固自己的知,启自己的思,提升自己的修养,你收,其,也是在学、在、在工作中的最重要、最常用的基本功。

如果写程序是把自己的思化代,程序就是把代化你理解的人的思。

当你程序有烈的代入感,像演一,真正入到的精神世界,面部表情也随之日丰富起来。

祝你!你通关了!之,看得多,得多,拼得多,你就考得多⋯⋯NOIP2011-1 .#include <iostream>#include <cstring>using namespace std;const int SIZE = 100;int main(){int n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i=1;i<=n;i++){cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){i++;sum+=a[i];}cout<<i<<endl;return 0;}输入:114 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i 值(中位数),而不是sum ,也不是a[x]输出: 3NOIP2011-2 .#include <iostream> using namespace std; int n;void f2(int x,int y); void f1(int x,int y){if(x<n)f2(y,x+y);}void f2(int x,int y){cout<<x<<' ';f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入: 30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出: 1 2 5 13 34NOIP2011-3 .#include <iostream>using namespace std; const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]);visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++)visited[i]=false;ans=0;for(i=1;i<=n;i++)dfs(i,0);cout<<ans<<endl;return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS ),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则 ans=len,可以说明这是个在图中用DFS找最长的路径的程序。

NOIP2011题解

NOIP2011题解
3.Bus 观光公交 算法 1: 对于 10%的数据 K=0,即没有加速器的情况。设 time[i]表示公交到 i 景点的时间, num[i]表示 i 为起点的所有乘客达到 i 景点的最晚时间。则 Time[i]=max(time[i-1],num[i-1])+d[i-1] 则答案为∑time[b[i]]-t[i] i∈[1,m] 复杂度:O(n) 期望分数 10 分 算法 2: 对于 20%的数据 K=1,即只能使用一个加速器,由于 N<=1000,于是我们可以依次 尝试减少每一个 d[i],然后继续执行算法 1。 复杂度:O(n^2) 期望分数 20 分 若同时结合算法 1 可以得到 30 分 算法 3: 观察∑time[b[i]]-t[i] i∈[1,m]等价于∑time[b[i]]-∑t[i] i∈[1,m],由于∑ t[i]是定值,所以我们需要让∑time[b[i]]尽可能小。 观察 Time[i]=max(time[i-1],num[i-1])+d[i-1],若我们使 d[i-1]减少 1,则
3 / 16
复杂度:O(n^2m) 期望分数 30 分 算法 3:
对于算法 1,我们需要依次枚举每一个区间,后枚举每一个区间内的所有矿石,由 于区间可能重复的非常多,所以我们做了很多“无用功”。对于当前参数 w,我们 可以预处理出一个前缀和 cnt[i]表示前 i 个矿石 w[i]>=w 的个数,sum[i]表示前 i 个矿石 w[i]>=w 的价值和,则递推式为: 边界条件:cnt[0]=0 sum[0]=0 若 w[i]>=w 则
2. Hotel 选择客栈 按照题目要求的进行模拟,每次选择两个进行判断,若满足以下条件: (1)两个客栈颜色相同 (2)两个客栈中间(包含两个客栈)中存在一家咖啡店最低消费小于等于 p 的 即算作一个满足条件的解,题目要求求出解的个数。 算法 1: 枚举两个客栈,判断颜色是否相同,并顺序枚举求两个客栈的最小值,看是否小于 等于 p。 复杂度 O(N^3) 期望得分 30-40 分 算法 2: 对于求两个客栈的最小值问题,为经典的 RMQ 问题,可以用线段树维护一段区间的 最小值。 复杂度 O(NlogN+N^2logN) 期望得分 50 分 算法 3: 对于思路 2,可以用 ST 算法 O(1)时间求出两个区间的最小值。 复杂度 O(NlogN+N^2) 期望得分 50-60 分 具体请参考程序 2 算法 4: 我们发现这个 RMQ 问题有很强的特殊性,由于我们要枚举所有的区间,按照双重循

noip2011初赛试题及答案(完美Word版)-推荐下载

noip2011初赛试题及答案(完美Word版)-推荐下载

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

共计30分。

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

)B 1.在二进制下,1100011 +()= 1110000。

A.1011B.1101C.1010 D.1111B 2.字符“A”的ASCII码为十六进制41,则字符“Z”的ASCII码为十六进制的()。

A.66 B.5A C.50 D.视具体的计算机而定A 3.右图是一棵二叉树,它的先序遍历是()。

A.ABDEFC B.DBEFAC C.DFEBCA D.ABCDEFD 4.寄存器是()的重要组成部分。

A.硬盘B.高速缓存C.内存D.中央处理器(CPU)B 5.广度优先搜索时,需要用到的数据结构是()。

A.链表B.队列C.栈D.散列表A 6.在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指()。

A.程序运行时理论上所占的内存空间B.程序运行时理论上所占的数组空间C.程序运行时理论上所占的硬盘空间D.程序源文件理论上所占的硬盘空间C 7.应用快速排序的分治思想,可以实现一个求第K大数的程序。

假定不考虑极端的最坏情况,理论上可以实现的最低的算法时间复杂度为()。

A.O(n2)B.O(n log n)C.O(n)D.O(1)D 8.为解决Web应用中的不兼容问题,保障信息的顺利流通,()制定了一系列标准,涉及HTML、XML、CSS等,并建议开发者遵循。

A.微软B.美国计算机协会(ACM)C.联台国教科文组织D.万维网联盟(W3C)B 9.体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。

每个同学按顺序来到操场时,都从排尾走向排头,找到第一个比自己高的同学,并站在他的后面。

这种站队的方法类似于()算法。

A.快速排序B.插入排序C.冒泡排序D.归并排序A 10.1956年()授予肖克利(William Shockley)、巴丁(John Bardeen)和布拉顿(Walter Brattain),以表彰他们对半导体的研究和晶体管效应的发现。

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docxNOIP 提高组初赛历年试题及答案阅读题篇程序写果(共 4 ,每 8 分,共 32 分)程序的最好方法并非是依次从到尾。

程序不像迷,我无法从末尾几找到答案,也不像一本引人入的籍,只需直接翻到褶最多的那几,我就能找到最精彩的片断。

因此我在程序,最好逐一考察研究每一段代,搞清楚每一段代的来去脉,理解每一段代在程序中所起的作用,而形成一个虚的程序构,并以此基来行。

1、分:高入手,逐深入,正确理解程序。

2、写注解:固化、、提已有的理解成果。

3、先模:根据代序跟踪量,模运算。

4、找律:先模几次循后,找出背后的律。

5、看功能:从代构和运算果判断程序功能。

6、猜算法:有不知道算法,通构和函数猜一猜。

7、方法:了解程序本后,一个熟悉的方法。

大多数人来,写程序是令人开心的一件事情,人的程序却很痛苦,很恐惧,宁愿自己重写一遍。

其到好的程序,就像一篇美文,令人心神怡,豁然开朗,因背后是一个人的思,甚至整个人生。

人的程序不可以巩固自己的知,启自己的思,提升自己的修养,你收,其,也是在学、在、在工作中的最重要、最常用的基本功。

如果写程序是把自己的思化代,程序就是把代化你理解的人的思。

当你程序有烈的代入感,像演一,真正入到的精神世界,面部表情也随之日丰富起来。

祝你!你通关了!之,看得多,得多,拼得多,你就考得多??NOIP2011-1 .#include#includeusing namespace std;const int SIZE = 100;int main(){int n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i=1;i<=n;i++){cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){i++;sum+=a[i];}cout<<i<<endl;< p="">return 0;}输入:114 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i 值(中位数),而不是sum ,也不是a[x]输出: 3NOIP2011-2 .#include using namespace std; int n;void f2(int x,int y); void f1(int x,int y){if(x<n)< p="">f2(y,x+y);}void f2(int x,int y){cout<<x<<' ';<="" p="">f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入: 30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出: 1 2 5 13 34 NOIP2011-3 .#includeusing namespace std; const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]); visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++)visited[i]=false;ans=0;for(i=1;i<=n;i++)dfs(i,0);cout<<ans<<endl;< p="">return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS ),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则ans=len,可以说明这是个在图中用DFS找最长的路径的程序。

NOIP提高组初赛历年试题及答案阅读题篇

NOIP提高组初赛历年试题及答案阅读题篇

NOIP提高组初赛历年试题及答案阅读题篇阅读程序写结果(共4 题,每题8 分,共计32 分)阅读程序的最好方法并非是依次从头到尾。

程序不像迷语,我们无法从末尾几页找到答案,也不像一本引人入胜的书籍,只需直接翻到褶皱最多的那几页,我们就能找到最精彩的片断。

因此我们在阅读程序时,最好逐一考察研究每一段代码,搞清楚每一段代码的来龙去脉,理解每一段代码在程序中所起的作用,进而形成一个虚拟的程序结构,并以此为基础来进行阅读。

1、分层读:高层入手,逐层深入,正确理解程序。

2、写注解:固化、总结、提炼已有的理解成果。

3、先模拟:根据代码顺序跟踪变量,模拟运算。

4、找规律:先模拟几次循环后,找出背后的规律。

5、看功能:从代码结构和运算结果判断程序功能。

6、猜算法:有时不知道算法,通过结构和函数猜一猜。

7、换方法:了解程序本质后,换一个熟悉的方法试试。

对大多数人来说,写程序是令人开心的一件事情,读别人的程序却很痛苦,很恐惧,宁愿自己重写一遍。

其实读到好的程序,就像读一篇美文,令人心旷神怡,豁然开朗,因为这背后是一个人的思维,甚至整个人生。

阅读别人的程序不仅可以巩固自己的知识,启发自己的思维,提升自己的修养,让你收获满满,其实,这也是在学习、在竞赛、在工作中的最重要、最常用的基本功。

如果说写程序是把自己的思维转化为代码,读程序就是把代码转化为你理解的别人的思维。

当你阅读程序时有强烈的代入感,像演员一样,真正进入到编剧的精神世界,面部表情也随之日渐丰富起来。

祝贺你!你通关了!总之,看得多,码得多,拼得多,你就考得多……NOIP2011-1.#include <iostream>#include <cstring> using namespace std; const int SIZE = 100; int main(){int n,i,sum,x,a[SIZE]; cin>>n;memset(a,0,sizeof(a)); for(i=1;i<=n;i++){ cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){ i++;sum+=a[i];}cout<<i<<endl; return 0;}输入:4 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i值(中位数),而不是sum,也不是a[x]输出:3NOIP2011-2.#include <iostream>using namespace std;int n;void f2(int x,int y);void f1(int x,int y){if(x<n)f2(y,x+y);void f2(int x,int y){cout<<x<<' ';f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入:30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出:1 2 5 13 34NOIP2011-3.#include <iostream>using namespace std;const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]);visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++) {cin>>a>>b>>c; e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++) visited[i]=false; ans=0;for(i=1;i<=n;i++) dfs(i,0);cout<<ans<<endl; return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则ans=len,可以说明这是个在图中用DFS找最长的路径的程序。

noip提高组2009年之前最水的题

noip提高组2009年之前最水的题

【文章标题】深度剖析:noip提高组2009年之前最水的题1. 引言noip(全国青少年信息学奥林匹克联赛)作为我国最具影响力的计算机竞赛之一,每年都吸引着众多热衷于计算机编程的青少年参与。

其中,提高组的试题一直是广大参赛选手关注的焦点。

今天,我们将深度剖析noip提高组2009年之前最水的题,以期能带领大家更深入地理解这些经典试题。

2. 选择题目在2009年之前的noip提高组试题中,有一道题目备受瞩目,那就是……3. 评估主题让我们来评估一下这道经典题目。

这道题目难度如何?它蕴含着哪些深层次的计算机编程知识?我们将从不同的角度来探讨这一问题。

4. 深入解析在深入解析这道题目的过程中,我们发现它其实涉及到了……。

这为我们带来了……5. 分析细节接下来,我们将细致分析这道题目的每一个细节。

让我们来看一下题目的背景设定。

我们将重点分析题目要求中的关键词,以及这些关键词所蕴含的深层意义。

我们将结合具体的示例,来逐步揭示这些细节背后隐藏的精髓。

6. 具体案例举一个具体案例来说明这个题目。

假设题目是……,那么我们可以这样解答……。

通过这个案例,我们可以看到……7. 总结回顾通过对这个题目的深入分析,我们可以得出结论:它虽然在表面上看起来很简单,但实际上却蕴含着丰富的计算机编程知识。

通过反复思考和练习,我们可以更好地理解和掌握这些知识,从而在真实的编程实践中游刃有余。

8. 个人观点我个人对这个题目的理解是……。

在我看来,这道题目不仅仅是一道简单的计算机编程题,更是一次对自己编程能力的考验。

只有深入思考和实践,我们才能真正领悟其中蕴含的技术精髓。

9. 结语noip提高组2009年之前最水的题所蕴含的深层次计算机编程知识是深不可测的。

通过深度剖析这一经典题目,我们可以更好地理解和掌握这些知识,从而在计算机编程的道路上不断前行。

以上就是本文对noip提高组2009年之前最水的题的深度剖析和全面评估,希望能为大家提供一些思路和帮助。

【精选资料】NOIP提高组复赛试题与简解转载

【精选资料】NOIP提高组复赛试题与简解转载

Day1铺地毯【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。

一共有n 张地毯,编号从1 到n。

现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。

注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

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

输入共 n+2 行。

第一行,一个整数 n,表示总共有n 张地毯。

接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。

第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。

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

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

【输入输出样例 1】【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。

【输入输出样例 2】【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。

【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。

【一句话题意】给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。

【考察知识点】枚举【思路】好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。

置答案ans=-1,按顺序枚举所有矩形,如果点在矩形内则更新ans。

注意题中给出的不是对角坐标,实际上是(a,b)与(a+g,b+k)。

NOIP2015提高组day1第二题解题报告

NOIP2015提高组day1第二题解题报告

NOIP2015提高组day1第二题解题报告NOIP2015提高组复赛Day1第二题解题报告By 某蒟蒻zrw1.题目大概描述(因为写的时候题目还没放出来)几个小盆友们在传递自己的信息(生日),并且每个小盆友只会把自己知道的信息传给唯一的一个人【但是自己可以收到很多信息,并会在收到信息的下一轮把这些信息传给那个唯一的人】(单相思233333),问多少轮后自己会收到自己一开始传递出去的自己的信息。

输入:第一行一个整数n,表示有n个人接下来n行,每行一个数j,设这是除第一行外的第i行,那么j 表示第i个人只会把信息传给第j个人。

输出:一个整数,表示最少几轮后自己的信息会回到自己手中。

样例输入:52 4 23 1样例输出:3数据规模:100% n<=200000 60% n<=2500 30% 记不住了……2.大概需要什么样的算法根据数据规模,我们可以大概判断需要多少效率的算法,甚至有的时候可以猜出这题用的是什么算法。

对于本题来说,60%大概就是O(n^2)的算法了,一般是裸的暴力回溯或者是暴力广搜,也有用floyd的(我是从NOIP吧上看到的)。

如果要AC的话,算法效率至少要在O(nlogn)以下(log在这里是以2为底不是以10为底)。

然而,本题是有O(n)算法的,下面会讲。

3.我们还是画个图吧(图可能比较难看,但能看就行)画画图,就会知道这是在做一件什么事情了。

以样例数据为例:我们很容易发现,2,3,4,形成了一个环,而1和5,并没有什么卵用……所以在环234中,由于每一轮可以把在上一轮知道的信息传给唯一的下一个人,在234环中,就需要3轮,信息才能传到多画几个图(由于本人很懒,就只画一张特殊情况比较多的小图):(有木有一种贵圈真乱的感觉)我们可以看出来,1,5,6,成了一个环,而2,3,4,8,也成了一个环,7,9,是来打酱油的。

那么对于这两个环来说,因为每一轮可以传递上一轮信息给下一个人,所以显然是1,5,6这个环比较早传完,3轮。

noip提高组试题dayday

noip提高组试题dayday

CCF 全国信息学奥林匹克联赛(NOIP2017)复赛提高组 day1(请选手务必仔细阅读本页内容)注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。

2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,2.8GHz,内存4G,上述时限以此配置为准。

4、只提供Linux 格式附加样例文件。

5、提交的程序代码文件的放置位置请参照各省的具体要求。

6、特别提醒:评测在当前最新公布的NOI Linux 下进行,各语言的编译器版本以其为准。

【问题描述】1.小凯的疑惑(math.cpp/c/pas)小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。

每种金币小凯都有无数个。

在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。

现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。

【输入格式】输入文件名为math.in。

输入数据仅一行,包含两个正整数a 和b,它们之间用一个空格隔开,表示小凯手中金币的面值。

【输出格式】输出文件名为math.out。

输出文件仅一行,一个正整数N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

【输入输出样例1】math/math1.in math/math1.ans【输入输出样例1 说明】小凯手中有面值为3 和7 的金币无数个,在不找零的前提下无法准确支付价值为1、2、4、5、8、11 的物品,其中最贵的物品价值为11,比11 贵的物品都能买到,比如:12 = 3 * 4 + 7 * 013 = 3 * 2 + 7 * 114 = 3 * 0 + 7 * 215 = 3 * 5 + 7 * 0……【输入输出样例2】见选手目录下的math/math2.in 和math/math2.ans。

第十七届NOIP2011 提高组初赛试题及答案解析

第十七届NOIP2011 提高组初赛试题及答案解析

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

)1. 在二进制下,1011010+()=1100111。

A.1011B.1101C.1010D.1111解析:简单的二进制运算,炮灰都会。

直接用减法:1100111-1011010=00001101;也可用补码计算:1100111-1011010=(1100111)补+(-1011010)补=(01100111)+(11011010)补=(01100111)+(10100101+00000001)=(01100111)+10100110)=100001101=1101(超过8位者溢出)。

答案:B2. 字符“A”的ASCII码为十六进制41,则字符“Z”的ASCII码为十六进制的()。

A.66 B.5A C.50 D.视具体的计算机而定解析:每年必考进制转换题。

若记得ASCII码的可以直接算出Z的码然后转回16进制,A的ASCII码是65,则Z的ASCII码为65+25=90,(90)10=(5A)16。

若不记得的就把十六进制的41转回十进制,4*16+1=65,然后+25得90,再转成16进制得5A。

答案:BA.ABDEFC B.DBEFAC C.DFEBCA D.ABCDEF解析:每年必考树的遍历题。

先序遍历就是先根遍历,就是先根,再左右子树的遍历。

然后就ABDEFC出来了。

答案:A4. 寄存器是()的重要组成部分。

A. 硬盘B. 高速缓存C. 内存D. 中央处理器(CPU)解析:每年必考硬件知识题。

计算机中能存储数据的部件有:寄存器,一级缓存,二级缓存,只读存储器ROM,随机存储器RAM和外存。

其中寄存器和一级缓存在CPU内,一级缓存又名片上的缓存。

二级缓存,只读存储器ROM和随机存储器RAM都在主板上,二级缓存又名板上的缓存,只读存储器ROM和随机存储器RAM共同构成内存。

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

NOIP 2011 提高组day1 题解美少女战士原创1.铺地毯(carpet.cpp/c/pas)【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。

一共有n 张地毯,编号从1 到n。

现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。

注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

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

输入共 n+2 行。

第一行,一个整数 n,表示总共有n 张地毯。

接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。

第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。

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

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

【输入输出样例 1】carpet.in carpet.out3 31 02 30 2 3 32 13 32 2【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。

【输入输出样例 2】carpet.in carpet.out3 -11 02 30 2 3 32 13 34 5【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。

(不好意思,因为是从PDF中复制过来的,所以没有图,不过挺简单的,大家可以自己做一下)(嘿嘿,还是我的朋友智慧,我怎么就没想到用QQ截图)【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。

//其实吧,感觉这道题就是送分得(大牛们不要鄙视我)//刚看到这道题时,会以为是图论,建一个图,然后每输入一次就更改一下图,最后访问图中的一个点仔细想想,其实完全没有必要嘛,干嘛要改整个图呢,可以把这些都记住,然后只改要求的那一个点,毕竟它只要一个点,然后就有了比较简单的AC方法了//^^^思想已经在上面了,下面就给出标程吧//varans,i,j,k,n:longint;x,y,l,r:array[1..10000]of longint;beginassign(input,'carpet.in');assign(output,'carpet.out');reset(input);rewrite(output);readln(n);for i:=1 to n do readln(x[i],y[i],l[i],r[i]);readln(i,j);ans:=-1;for k:=1 to n do if(x[k]<=i)and(x[k]+l[k]>=i)and(y[k]<=j)and(y[k]+r[k]>=j)then ans:=k;writeln(ans);close(input);close(output);end.2.选择客栈(hotel.cpp/c/pas)【问题描述】丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号。

每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。

两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。

晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。

他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

【输入】输入文件 hotel.in,共n+1 行。

第一行三个整数 n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;接下来的 n 行,第i+1 行两个整数,之间用一个空格隔开,分别表示i 号客栈的装饰色调和i 号客栈的咖啡店的最低消费。

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

输出只有一行,一个整数,表示可选的住宿方案的总数。

【输入输出样例 1】hotel.in hotel.out5 2 3 30 51 30 21 41 5样例说明客栈编号① ② ③ ④ ⑤色调 0 1 0 1 1最低消费 5 3 2 4 52 人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤,但是若选择住4、5 号客栈的话,4、5 号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是3 元,所以不满足要求。

因此只有前3 种方案可选。

【数据范围】对于 30%的数据,有n≤100;对于 50%的数据,有n≤1,000;对于 100%的数据,有2≤n≤200,000,0<k≤50,0≤p≤100,0≤最低消费≤100。

//智慧的分割线//……这道题吧,很容易就能想到一种暴搜方案,二重循环,任意两个旅馆组合,再加一重循环找最小值,判断是否可行,可以想象,N^3的复杂度,最多能过三组,除非实在没办法,才能用这种方法;那么如何优化呢?显然,在枚举两个旅馆的时候,把这两个旅馆间的都访问过了,所以,我们就可以减一重循环在访问时,顺便记录最小值//for j:=i+1 to n do if b[j]<min then min:=b[j];(这是枚举第二个旅馆时顺便加的操作)//这样之后,时间复杂度就降到N^2了(嘿嘿,有点成就感),可是,对于数据来说,我们仍然只能过5组……怎么办呢?继续优化吧注意到最多只有50种颜色,那么我们可以记录每种颜色的旅馆的数量,从前往后一旦搜到有一个同种颜色,那么,之后的同种颜色的旅馆都可行(正确性就不证明了吧),然而,这里又有一个问题,如何知道一个旅馆后有多少个同种颜色的旅馆呢(显然不能搜了,否则就白优化了),所以可以建立一个200000*50 的数组,初始化一下就行,num【i,j】:=num【i+1,j】(color[i]<>j);/num[i+1,j]+1(color[i]=j);//虽然我考试时不是这样做的,用得是一维数组加记录(这里是为了便于大家理解)这样,平均时间复杂度不到(n*K)这道题就AC了//下面给出我考试时的AC代码//varn,k,p,i,j,min,ans,l:longint;a,b:array[1..200000]of longint;c:array[0..50]of longint;beginassign(input,'hotel.in');assign(output,'hotel.out');reset(input);rewrite(output);readln(n,k,p);for i:=1 to n do begin readln(a[i],b[i]);inc(c[a[i]]);end;//标注一下,这里记录了同种颜色的旅馆个数//for i:=1 to n-1 dobeginmin:=b[i];dec(c[a[i]]);//如果搜过,那就减去吧//l:=c[a[i]];//为了记录剩余的个数,引入的变量//for j:=i+1 to n dobeginif b[j]<min then min:=b[j];if (a[i]=a[j])and(min<=p) then begin inc(ans,l);break;end;if a[i]=a[j] then dec(l);end;end;writeln(ans);close(input);close(output);end.3.Mayan 游戏(mayan.cpp/c/pas)【问题描述】Mayan puzzle 是最近流行起来的一个游戏。

游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。

游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图1 和图2);//呀,不好意思,PDF的图片我复制不出来,还望见谅,用字母写出来,还望见谅//3 04 3<—3 0 4 0 00 4 2 ==》 3 4 2 ==> 3 0 20 3 4 2 0 3 4 2 0 3 3 20 1 1 2 1 0 1 1 2 1 0 1 1 2 12、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1 到图3)。

注意:a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为1 的方块和三个颜色为2 的方块会同时被消除,最后剩下一个颜色为2 的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5 所示的情形,5 个方块会同时被消除)。

3、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。

注意:掉落的过程中将不会有方块的消除。

上面图 1 到图3 给出了在棋盘上移动一块方块之后棋盘的变化。

棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1 变成图2 所示的状态,此时在一竖列上有连续三块颜色为4 的方块,满足消除条件,消除连续3 块颜色为4 的方块后,上方的颜色为3 的方块掉落,形成图3 所示的局面。

【输入】输入文件 mayan.in,共6 行。

第一行为一个正整数 n,表示要求游戏通关的步数。

接下来的 5 行,描述7*5 的游戏界面。

每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10 种,从1 开始顺序编号,相同数字表示相同颜色)。

输入数据保证初始棋盘中没有可以消除的方块。

相关文档
最新文档