NOIP 2006年普及组解题报告
- 格式:pdf
- 大小:87.16 KB
- 文档页数:5
1、DP,f表示合并区间内的珠子获得最大能源2、DP,可以先把主件和附件的搭配全部分出来,然后分阶段做背包3、模拟4、递推+高精度1.这题具有最优子结构的性质,与合并石子相似,所以可以用动态规划来做。
首先将数据存于c数组中,每次需要枚举一下起始点i和终点j的位置,还要枚举起点和终点之间一个断点k的位置,表示第i—k个珠子已经合并在了一起,第k—j个珠子也已经合并在了一起,当前要合并的是这两个已经合并在了一起的小珠子,这样就把一个问题分成了许多子问题。
当前一次操作所产生的能量K=c[i]*c[k]*c[j]具体做法是:开一个二维数组a,a[i,j]表示从i开始到j结束这一段中所有珠子合并所能产生的能量的最大值。
然后先枚举段的长度i(i为2到N),接着枚举开始位置j,由i, j 可推出结束位置k。
然后枚举断点位置v,v为j+1到k-1之间。
在每个断点处断开所能获得的能量为K=c[j]*c[v]*c[k]+a[j,v]+a[v,k]。
取这中间的一个最大值赋给a[j , k]。
这样做的时间复杂度为O(n3),因为N<=100,所以时间上肯定没有问题。
最后a[i,i]的最大值就是合并所有珠子后所能产生的能量的最大值。
constmaxn=100;varc:array[0..maxn] of longint;a:array[0..maxn,0..maxn] of longint;n,i,j,k,t,v,u,max:longint;beginassign(input,'energy.in'); reset(input);assign(output,'energy.out'); rewrite(output);readln(n);for i:=0 to n-1 do read(c[i]);fillchar(a,sizeof(a),0);for i:=2 to n do beginfor j:=0 to n-1 do begink:=(j+i) mod n;max:=0;for v:=j+1 to j+i-1 do beginu:=v mod n;t:=c[j]*c[u]*c[k]+a[j,u]+a[u,k];if t>max then max:=t;end;a[j,k]:=max;end;end;max:=0;for i:=0 to n-1 doif a[i,i]>max then max:=a[i,i];writeln(max);close(input); close(output)end.2、此题初看MS是01背包问题,只是多了附件这个条件。
第十二届全国青少年信息学奥林匹克联赛初赛试题 2006(普及组C++ 语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案.)1. 在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是()。
A. 沃尔夫奖B. 诺贝尔奖C. 菲尔兹奖D. 图灵奖2. 在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。
A. gcc/g++B. Turbo PascalC. RHIDED. free pascal3. 以下断电之后仍能保存数据的有()。
A. 寄存器B. ROMC. RAMD. 高速缓存4.Linux是一种( )。
A. 绘图软件B. 程序设计语言C. 操作系统D. 网络浏览器5. CPU是( )的简称。
A. 硬盘B. 中央处理器C. 高级程序语言D. 核心寄存器6. 在计算机中,防火墙的作用是()。
A. 防止火灾蔓延B.防止网络攻击C. 防止计算机死机D. 防止使用者误删除数据7. 在下列关于计算机语言的说法中,不正确的是()。
A. Pascal和C都是编译执行的高级语言B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上C. C++是历史上的第一个支持面向对象的计算机语言D. 与汇编语言相比,高级语言程序更容易阅读8. 在下列关于计算机算法的说法中,不正确的是()。
A. 一个正确的算法至少要有一个输入B. 算法的改进,在很大程度上推动了计算机科学与技术的进步C. 判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法9. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是()。
A. 选择排序B. 冒泡排序C. 插入排序D. 基数排序10.在编程时(使用任一种高级语言,不一定是C++),如果需要从磁盘文件中输入一个很大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上()。
第十二届全国青少年信息学奥林匹克联赛初赛试题(普及组Pascal语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案.)。
1.在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是()。
A.沃尔夫奖B.诺贝尔奖C.菲尔兹奖D.图灵奖2.在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。
A.gcc/g++B.Turbo PascalC.RHIDED.free pascal3.以下断电之后仍能保存数据的有()。
A.寄存器B.ROMC.RAMD.高速缓存4.Linux是一种()。
A.绘图软件B.程序设计语言C.操作系统D.网络浏览器5.CPU是()的简称。
A.硬盘B.中央处理器C.高级程序语言D.核心寄存器6.在计算机中,防火墙的作用是()。
A.防止火灾蔓延B.防止网络攻击C.防止计算机死机D.防止使用者误删除数据7.在下列关于计算机语言的说法中,不正确的是()。
A.Pascal和C都是编译执行的高级语言B.高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上C.C++是历史上的第一个支持面向对象的计算机语言D.与汇编语言相比,高级语言程序更容易阅读8.在下列关于计算机算法的说法中,不正确的是()。
A.一个正确的算法至少要有一个输入B.算法的改进,在很大程度上推动了计算机科学与技术的进步C.判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性D.目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法9.在下列各种排序算法中,不是以“比较”作为主要操作的算法是()。
A.选择排序B.冒泡排序C.插入排序D.基数排序10.在编程时(使用任一种高级语言,不一定是Pascal),如果需要从磁盘文件中输入一个很大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上()。
【NOIP2006普及组】开⼼的⾦明
看过题后,你可能会发现这是很典型的0-1背包问题,即要么选择这件要么不选。
0-1背包问题最经典的解法就是动态规划了。
当然这道题的数据范围较⼩,也可以⽤暴搜(暴⼒搜索)来做,即枚举所有情况。
我们⽤递归来实现⼀下。
对于每⼀件物品就模拟两种情况选或者不选,千万不要漏掉哪⼀种情况,最后求取最⼤值就好了。
(由于我们当时模拟赛,所以写了⽂件读取数据,请见谅。
)
好了,暴搜的解法就介绍到这⾥,接下来,要介绍经典解法——动态规划。
动态规划最重要的就是建⽴递推式,根据上⾯讲解我们已经明确了对于每个物品依次检查选或不选,⽤dp[i][j]表⽰前 i 个物品在 j ⾦额下的最优解(结果最⼤)。
如果j放不下第i个物品的话,那么就只能从编号为[1,i-1]的物品中选择了,也就是dp[i-1][j]的值。
所以,
dp[i][j] = dp[i-1][j]; (其中,j < v[i])
那么j可以放的下这个物品的时候应该怎么办呢?很明显,我们有两种选择,选或不选,之后我们取较⼤的值。
选 dp[i-1][j-v[i]]+v[i]*p[i];
不选 dp[i-1][j];
所以我们得到递推式
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+v[i]*p[i]);(其中,j>=v[i])
把两种情况整理⼀下,
怎么样?思路明确多了吧!
根据递推式来写代码就好了。
最后附上AC代码。
第十二届全国青少年信息学奥林匹克联赛初赛试题 2006(普及组C++ 语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案.)1. 在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是()。
A. 沃尔夫奖B. 诺贝尔奖C. 菲尔兹奖D. 图灵奖2. 在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。
A. gcc/g++B. Turbo PascalC. RHIDED. free pascal3. 以下断电之后仍能保存数据的有()。
A. 寄存器B. ROMC. RAMD. 高速缓存4.Linux是一种( )。
A. 绘图软件B. 程序设计语言C. 操作系统D. 网络浏览器5. CPU是( )的简称。
A. 硬盘B. 中央处理器C. 高级程序语言D. 核心寄存器6. 在计算机中,防火墙的作用是()。
A. 防止火灾蔓延B.防止网络攻击C. 防止计算机死机D. 防止使用者误删除数据7. 在下列关于计算机语言的说法中,不正确的是()。
A. Pascal和C都是编译执行的高级语言B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上C. C++是历史上的第一个支持面向对象的计算机语言D. 与汇编语言相比,高级语言程序更容易阅读8. 在下列关于计算机算法的说法中,不正确的是()。
A. 一个正确的算法至少要有一个输入B. 算法的改进,在很大程度上推动了计算机科学与技术的进步C. 判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法9. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是()。
A. 选择排序B. 冒泡排序C. 插入排序D. 基数排序10.在编程时(使用任一种高级语言,不一定是C++),如果需要从磁盘文件中输入一个很大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上()。
NOIP2006复赛普及组解题报告【第一题解题思想】:这道题属于容易题,但是题目难度大于NOIP2005和2004普及组第一题,和去年第二题难度相当后者略低一些。
解法1:我们可以用先去掉重复(读入第i个数,和他前面的i-1个数比较),然后用简单排序和冒泡排序排序,最后输出结果。
解法2:运用插入排序(略加修改),边排序边除掉重复。
解法3:直接排序,不去掉重复,计算出不重复的元素个数,输出不重复的元素即可。
如果用数组A存储这些随机数,对于2到N个元素需要比较A是否等于A[i-1]。
解法4:开一个1到1000初值均为假的布尔数组A。
用整型变量X读入N个随机数,赋A[X]的值为真。
统计数组中值为真的元素个数即M,从i从1到1000输出A值为真的i。
这种方法可以算作哈希表的简单应用。
解法5:很多人想到排序,效率大概是O(n^2)吧,其实还有个更简单的方法。
用一个1到1000的数组储存每个数的出现情况,t每出现一次,a[t]=a[t]+1,而且,同时操作if(a[t]>1) 则总数=总数-1。
然后从1到1000的循环,如果a≠0,输出,这样就根本不用排序了。
大概这个应该是最优算法吧。
O(n)的效率。
program random(input,output);var a:array[1..1000] of integer; / ’a是记录数组,相当于数轴,与数一一对应,temp 是临时存储数据,n和题目一样,记录不相同的数的个数’ /i,m,temp,n:integer;beginassign(input,'d:\data\random.in');reset(input);assign(output,'d:\data\random.out');rewrite(output);read(n);readln;fillchar(a,sizeof(a),0); /*初始化数组为0,pascal有fillchar*/m:=n;for i:=1 to n dobeginread(temp);a[temp]:=a[temp]+1; /*记录是哪个数*/if a[temp]>1 then dec(m);end;write(m);writeln;for i:=1 to 1000 doif a>0 then / *如果a不为0。