noip提高组的C语言历届复赛试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip提高组的C语言历届复赛试题相关的知识,希望对你有一定的参考价值。

有多少给多少……
有答案或者解析的话更好~
是提高组的c的复赛啊!
要不然不给分!

参考技术A NOIP2007 初赛试题(提高组C)
? 中国计算机学会2007
1
第十三届全国青少年信息学奥林匹克联赛初赛试题
( 提高组C 语言二小时完成)
● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、单项选择题(共10 题,每题1.5 分,共计15 分。每题有且仅有一个正确答案)。
1. 在以下各项中,( )不是CPU 的组成部分。
A. 控制器B. 运算器C. 寄存器D. 主板E. 算术逻辑单元(ALU)
2.在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。
A. 二叉树B. 多叉树C.哈希表D. B+树E.二维表
3.在下列各项中,只有( )不是计算机存储容量的常用单位。
A. Byte B. KB C.MB D.UB E.TB
4.ASCII 码的含义是( )。
A. 二—十进制转换码B. 美国信息交换标准代码C. 数字的二进制编码
D. 计算机可处理字符的唯一编码E. 常用字符的二进制编码
5.在C 语言中,表达式23|2^5 的值是( )
A. 23 B. 1 C.18 D.32 E.24
6.在C 语言中,判断a 等于0 或b 等于0 或c 等于0 的正确的条件表达式是( )
A. !((a!=0)||(b!=0)||(c!=0))
B. !((a!=0)&&(b!=0)&&(c!=0))
C. !(a==0&&b==0)||(c!=0)
D. (a=0)&&(b=0)&&(c=0)
E. !((a=0)||(b=0)||(c=0))
7.地面上有标号为A、B、C 的3 根细柱,在A 柱上放有10 个直径相同中间有孔的圆盘,从上到下依
次编号为1,2,3,……,将A 柱上的部分盘子经过B 柱移入C 柱,也可以在B 柱上暂存。如果B 柱
上的操作记录为:“进,进,出,进,进,出,出,进,进,出,进,出,出”。那么,在C 柱上,从下
到上的盘子的编号为( )。
A. 2 4 3 6 5 7 B. 2 4 1 2 5 7 C. 2 4 3 1 7 6
D. 2 4 3 6 7 5 E. 2 1 4 3 7 5

8. 与十进制数17.5625 对应的8 进制数是( )。
A. 21.5625 B. 21.44 C. 21.73
D. 21.731 E. 前4 个答案都不对
9.欧拉图G 是指可以构成一个闭回路的图,且图G 的每一条边恰好在这个闭回路上出现一次(即一笔
画成)。在以下各个描述中,不一定是欧拉图的是( )。
A. 图G 中没有度为奇数的顶点
B. 包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径)
C. 包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径)
D. 存在一条回路,通过每个顶点恰好一次
E. 本身为闭迹的图
10. 一个无法靠自身的控制终止的循环称为“死循环”,例如,在C 语言程序中,语句“while(1)
printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有( )
是正确的。
A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,
任何编译系统都不做死循环检验
B.有些编译系统可以检测出死循环
C. 死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以检测

E. 对于死循环,只能等到发生时做现场处理,没有什么更积极的手段
二、不定项选择题(共10 题,每题1.5 分,共计15 分。每题正确答案的个数大于或等于1。多选
或少选均不得分)。
11. 设A=B=true,C=D=false,以下逻辑运算表达式值为真的有( )。
A. (? A∧B)∨(C∧D∨A) B. ? (((A∧B)∨C)∧D)
C. A∧(B∨C∨D)∨D D. (A∧(D∨C)) ∧B
12. 命题“P→Q”可读做P蕴涵Q,其中P、Q 是两个独立的命题。只有当命题P成立而命题Q不成立时,
命题“P→Q”的值为false,其他情况均为true。与命题“P→Q”等价的逻辑关系式是( )。
A. ? P∨Q B. P∧Q C. ? (P∨Q) D. ? (? Q∧P)
13. (2070)16 + (34)8 的结果是( )。
A. (8332)10 B. (208C)16
C. (100000000110)2 D. (20214)8

14. 已知7 个结点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为结点的编号,以下同),后根遍历
是4 6 5 2 7 3 1,则该二叉树的可能的中根遍历是( )
A. 4 2 6 5 1 7 3 B. 4 2 5 6 1 3 7
C. 4 2 3 1 5 4 7 D. 4 2 5 6 1 7 3
15. 冗余数据是指可以由其他数据导出的数据,例如,数据库中已存放了学生的数学、语文和英语的三
科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致,
例如,上面4 个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面
关于冗余数据的说法中,正确的是( )。
A. 应该在数据库中消除一切冗余数据
B. 与用高级语言编写的数据处理系统相比,用关系数据库编写的系统更容易消除冗余数据
C. 为了提高查询效率,在数据库中可以适当保留一些冗余数据,但更新时要做相容性检验
D. 做相容性检验会降低效率,可以不理睬数据库中的冗余数据
16.在下列各软件中,属于NOIP 竞赛(复赛)推荐使用的语言环境有( )。
A. gcc B. g++
C. Turbo C D. free pascal
17. 以下断电之后仍能保存数据的有( )。
A. 硬盘B. ROM C. 显存D. RAM
18. 在下列关于计算机语言的说法中,正确的有( )。
A. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高
B. 随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台
C. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
D. C是一种面向过程的高级计算机语言
19. 在下列关于算法复杂性的说法中,正确的有( )。
A. 算法的时间复杂度,是指它在某台计算机上具体实现时的运行时间
B. 算法的时间复杂度,是指对于该算法的一种或几种主要的运算,运算的次数与问题的规模之间的函
数关系
C. 一个问题如果是NPC类的,就意味着在解决该问题时,不存在一个具有多项式时间复杂度的算法。
但这一点还没有得到理论上的证实,也没有被否定
D. 一个问题如果是NP类的,与C有相同的结论
20. 近20年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下
列关于递归算法的说法中,正确的是( )。
A. 在1977年前后形成标准的计算机高级语言“FORTRAN77”禁止在程序使用递归,原因之一是该方
法可能会占用更多的内存空间
B. 和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些
C. 对于较复杂的问题,用递归方式编程往往比非递归方式更容易一些
D. 对于已经定义好的标准数学函数sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递
归调用
三.问题求解(共2 题,每题5 分,共计10 分)
1.给定n 个有标号的球,标号依次为1,2,…,n。将这n 个球放入r 个相同的盒子里,不允许
有空盒,其不同放置方法的总数记为S(n,r)。例如,S(4,2)=7,这7 种不同的放置方法依次为
(1),(234), (2),(134), (3),(124), (4),(123), (12),(34), (13),(24),
(14),(23)。当n=7,r=4 时,S(7,4)= _____________。
2.N 个人在操场里围成一圈,将这N 个人按顺时针方向从1 到N 编号,然后,从第一个人起,每
隔一个人让下一个人离开操场,显然,第一轮过后,具有偶数编号的人都离开了操场。依次做下去,直
到操场只剩下一个人,记这个人的编号为J(N) ,例如,J(5)=3 ,J(10)=5 ,等等。则
J(400)=______________。
(提示:对N=2m+r 进行分析,其中0≤r<2m )。
四.阅读程序写结果(共4 题,每题8 分,共计32 分)
1.#include <stdio.h>
int main()
int i,p[5],q[5],x,y=20;
for(i=0;i<=4;i++)
scanf("%d", &p[i]);
q[0]=(p[0]+p[1])+(p[2]+p[3]+p[4])/7;
q[1]=p[0]+p[1]/((p[2]+p[3])/p[4]);
q[2]=p[0]*p[1]/p[2];
q[3]=q[0]*q[1];
q[4]=q[1]+q[2]+q[3];
x=(q[0]+q[4]+2)-p[(q[3]+3)%4];
if(x>10)
y+= (q[1]*100-q[3])/(p[p[4]%3]*5);
else
y+=20+(q[2]*100-q[3])/(p[p[4]%3]*5);
printf("%d,%d\n", x,y);
return 0;


/*注:本例中,给定的输入数据可以避免分母为0 或数组元素下标越界。*/
输入:6 6 5 5 3
输出:_______________
2.#include <stdio.h>
void fun(int *a,int *b)
int *k;
k=a; a=b; b=k;

main( )
int a=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf("No.1: %d,%d ",a,b);
fun(&a,&b);
printf("No.2: %d,%d\n",a,b);

输出:____________________
3.#include "math.h"
#include "stdio.h"
main()
int a1[51]=0;
int i,j,t,t2,n=50;
for (i=2;i<=sqrt(n);i++)
if(a1[i]==0)
t2=n/i;
for(j=2;j<=t2;j++) a1[i*j]=1;

t=0;
for (i=2;i<=n;i++)
if(a1[i]==0)
printf("%4d",i); t++;
if(t%10==0) printf("\n");

printf("\n");


输出: ________________________________________
________________________________________
4. #include "stdio.h"
char ch[]='q','A','S','O','R','T','E','X','A','M','P','L','E';
int n=12;
void shift(int k, int n)
char v;
int j;
v=ch[k]; j=k+k;
while (j<=n)
if((j<n) && (ch[j]<ch[j+1])) j++;
if (v<ch[j])
ch[j/2]=ch[j]; j*=2;
else
return;
ch[j/2]=v;


void hpsrt(void)
int k;
char tmp;
for (k=n/2; k>0; k--) shift(k,n); /* 建堆*/
printf("No.1: ");
for(k=1; k<=n; k++) putchar(ch[k]);
putchar('\n');
for (k=n; k>0; k--)
tmp=ch[1]; ch[1]=ch[k]; ch[k]=tmp;
shift(1,k-1);


main()
int k;
hpsrt();
printf("No.2: ");
for(k=1; k<=n; k++) putchar(ch[k]);
putchar('\n');


输出:__________________________________________
___________________________________________
五.完善程序(前5 空,每空2 分,后6 空,每空3 分,共28 分)
1.(格雷码,Gray Code)
格雷码是对十进制数的一种二进制编码。编码顺序与相应的十进制数的大小不一致。其特点是:对于
两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数之间也仅有一个
二进制位不同,以4 位二进制数为例,编码如下:
十进制数格雷码十进制数格雷码
0 0000 8 1100
1 0001 9 1101
2 0011 10 1111
3 0010 11 1110
4 0110 12 1010
5 0111 13 1011
6 0101 14 1001
7 0100 15 1000
如果把每个二进制的位看作一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。因此,
格雷码广泛用于信号处理、数-模转换等领域。
下面程序的任务是:由键盘输入二进制数的位数n (n<16),再输入一个十进制数m(0≤m<2n),然
后输出对应于m 的格雷码(共n 位,用数组gr[]存放)。
为了将程序补充完整,你必须认真分析上表的规律,特别是对格雷码固定的某一位,从哪个十进制数
起,由0 变为1,或由1 变为0。
#include <stdio.h>
main()
int bound=1,m,n,i,j,b,p,gr[15];
printf("input n,m\n");
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) bound= ① ;
if(m<0||m>=bound)
printf("Data error!\n");
② ;

b=1;
for(i=1;i<=n;i++)
p=0; b=b*2;
for( ③ ;j<=m;j++)
if( ④ )
p=1-p;
gr[i]=p;

for(i=n; ⑤ )
printf("%1d",gr[i]); /* 在"%1d" 中出现的是数字1,不是字母l */
printf("\n");

2.(连续邮资问题)某国发行了n 种不同面值的邮票,并规定每封信最多允许贴m 张邮票,在这
些约束下,为了能贴出1,2,3,…,maxvalue连续整数集合的所有邮资,并使maxvalue 的值最
大,应该如何设计各邮票的面值?例如,当n=5、m=4 时,面值设计为1,3,11,15,32,可使
maxvalue 达到最大值70(或者说,用这些面值的1 至4 张邮票可以表示不超过70 的所有邮资,但无
法表示邮资71。而用其他面值的1 至4 张邮票如果可以表示不超过k 的所有邮资,必有k≤70)。
下面是用递归回溯求解连续邮资问题的程序。数组x[1:n]表示n 种不同的邮票面值,并约定各元
素按下标是严格递增的。数组bestx [1:n]存放使maxvalue 达到最大值的邮票面值(最优解),
数组y[maxl]用于记录当前已选定的邮票面值x[1:i]能贴出的各种邮资所需的最少邮票张数。请将程
序补充完整。
#include <stdio.h>
#define NN 20
#define maxint 30000
#define maxl 500 /*邮资的最大值*/
int n,m,bestx[NN],x[NN],y[maxl],maxvalue=0;
void result()
输出结果:最大值:maxvalue 及最优解: bestx[1:n](略)

void backtrace(int i,int r)
int j,k,z[maxl];
for(j=0;j<= ① ;j++)
if(y[j]<m)
for(k=1;k<=m-y[j];k++)
if(y[j]+k<=y[ ② ])
y[ ③ ]=y[j]+k;
while(y[r]<maxint) r++;
if(i>n)
if(r-1>maxvalue)
maxvalue= ④ ;
for(j=1;j<=n;j++)
bestx[j]=x[j];

return;

for(k=0;k<maxl;k++)
z[k]=y[k];
for(j= ⑤ ;j<=r;j++)
x[i]=j;
⑥ ;
for(k=0;k<maxl;k++)
y[k]=z[k];


void main()
int j;
printf("input n,m:\n");
scanf(“%d%d”,&n,&m);
for(j=1;j<maxl;j++)
y[j]=maxint;
y[0]=0; x[0]=0; x[1]=1;
backtrace(2,1);
result();


答案:
一、单项选择题:(每题1.5分)

1. D 2. E 3. D 4. B 5. A

6. B 7. D 8. B 9. D 10. A

二、 不定项选择题 (共10题,每题1.5分,共计15分。每题正确答案的个数大于或等于1。多选或少选均不得分)。

11. ABC 12. AD 13. ABD 14. ABD 15. BC

16. ABD 17. AB 18. CD 19. BC 20. AC

三、问题求解:(共2题,每题5分,共计10分)

1.350

2.289

四、阅读程序写结果(共4题,每题8分,共计32分)

1 129,43

2 No.1:3,6 No.2:3,6

3 2 3 5 7 11 13 17 19 23 29

31 37 41 43 47

4 No.1: XTORSEAAMPLE

No.2: AAEELMOPRSTX

五.完善程序 (前5空,每空2分,后6空,每空3分,共28分)

(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)

1 ① bound*2

② return

③ j=0

④ (j % b-(b / 2))=0

⑤ <= 1

2 ① x[i-2]*(m-1)

② j+x[i-1]*k

③ j+x[i-1]*k (同2)

④ r-1

⑤ x[i-1]+1

⑥ backtrace(i+1,r)

http://ishare.iask.sina.com.cn/search.php?key=NOIP%CA%D4%CC%E2&format=

急求NOIP2009普及组试题

参考技术A NOIP2009普及组复赛试题
1.多项式输出
(poly.pas/c/cpp)
【问题描述】
一元 n 次多项式可用如下的表达式表示:
1 0
1
1 f (x) a x a xn ... a x a
n
n
n = + ? + + +
? , ≠ 0 n a
其中,
i
i a x 称为i 次项, i a 称为i 次项的系数。给出一个一元多项式各项的次数和系
数,请按照如下规定的格式要求输出该多项式:
1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。
2. 多项式中只包含系数不为0 的项。
3. 如果多项式n 次项系数为正,则多项式开头不出现“+”号,如果多项式n 次项系
数为负,则多项式以“-”号开头。
4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项
系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,
其系数的绝对值为1,则无需输出1)。如果x 的指数大于1,则接下来紧跟的指数部分的形
式为“x^b”,其中b 为x 的指数;如果x 的指数为1,则接下来紧跟的指数部分形式为“x”;
如果x 的指数为0,则仅需输出系数即可。
5. 多项式中,多项式的开头、结尾不含多余的空格。
【输入】
输入文件名为 poly.in,共有2 行
第一行 1 个整数,n,表示一元多项式的次数。
第二行有 n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空
格隔开。
【输出】
输出文件 poly.out 共1 行,按题目所述格式输出多项式。
【输入输出样例 1】
poly.in poly.out
5
100 -1 1 -3 0 10
100x^5-x^4+x^3-3x^2+10
【输入输出样例2】
poly.in poly.out
3
-50 0 0 1
-50x^3+1
【数据范围】
1 ≤ n ≤ 100,多项式各次项系数的绝对值均不超过100。
全国信息学奥林匹克联赛(NOIP2009)复赛普及组
第 3 页共 6 页
2.分数线划定
(score.pas/c/cpp)
【问题描述】
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对
所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根
据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%
(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有
选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成
绩。
【输入】
输入文件名为 score.in。
第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其
中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%
向下取整后小于等于n。
第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k
(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各
不相同。
【输出】
输出文件 score.out。
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为
进入面试的选手的实际人数。
从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手
的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的
顺序输出。
【输入输出样例】
score.in score.out
6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
88 5
1005 95
2390 95
1000 90
1001 88
3239 88
【样例说明】
m*150% = 3*150% = 4.5,向下取整后为4。保证4 个人进入面试的分数线为88,但因为88
有重分,所以所有成绩大于等于88 的选手都可以进入面试,故最终有5 个人进入面试。
全国信息学奥林匹克联赛(NOIP2009)复赛普及组
第 4 页共 6 页
3.细胞分裂
(cell.pas/c/cpp)
【问题描述】
Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家。现在,他正在为一个细胞实
验做准备工作:培养细胞样本。
Hanks 博士手里现在有N 种细胞,编号从1~N,一个第i 种细胞经过1 秒钟可以分裂为
Si 个同种细胞(Si 为正整数)。现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,
进行培养。一段时间以后,再把培养皿中的所有细胞平均分入M 个试管,形成M 份样本,
用于实验。Hanks 博士的试管数M 很大,普通的计算机的基本数据类型无法存储这样大的
M 值,但万幸的是,M 总可以表示为m1 的m2 次方,即2
1
M = m m ,其中m1,m2 均为基本
数据类型可以存储的正整数。
注意,整个实验过程中不允许分割单个细胞,比如某个时刻若培养皿中有4 个细胞,
Hanks 博士可以把它们分入2 个试管,每试管内2 个,然后开始实验。但如果培养皿中有5
个细胞,博士就无法将它们均分入2 个试管。此时,博士就只能等待一段时间,让细胞们继
续分裂,使得其个数可以均分,或是干脆改换另一种细胞培养。
为了能让实验尽早开始,Hanks 博士在选定一种细胞开始培养后,总是在得到的细胞“刚
好可以平均分入M 个试管”时停止细胞培养并开始实验。现在博士希望知道,选择哪种细
胞培养,可以使得实验的开始时间最早。
【输入】
输入文件名为 cell.in,共有三行。
第一行有一个正整数 N,代表细胞种数。
第二行有两个正整数 m1,m2,以一个空格隔开, 2
1
m m 即表示试管的总数M。
第三行有 N 个正整数,第i 个数Si 表示第i 种细胞经过1 秒钟可以分裂成同种细胞的个
数。
【输出】
输出文件 cell.out 共一行,为一个整数,表示从开始培养细胞到实验能够开始所经过的
最少时间(单位为秒)。
如果无论 Hanks 博士选择哪种细胞都不能满足要求,则输出整数-1。
【输入输出样例 1】
cell.in cell.out
1
2 1
3
-1
【输入输出样例1 说明】
经过 1 秒钟,细胞分裂成3 个,经过2 秒钟,细胞分裂成9 个,……,可以看出无论怎么分
裂,细胞的个数都是奇数,因此永远不能分入2 个试管。
全国信息学奥林匹克联赛(NOIP2009)复赛普及组
第 5 页共 6 页
【输入输出样例 2】
cell.in cell.out
2
24 1
30 12
2
【输入输出样例2 说明】
第 1 种细胞最早在3 秒后才能均分入24 个试管,而第2 种最早在2 秒后就可以均分(每
试管144/(241)=6 个)。故实验最早可以在2 秒后开始。
【数据范围】
对于 50%的数据,有2
1
m m ≤ 30000。
对于所有的数据,有1 ≤N≤ 10000,1 ≤m1 ≤ 30000,1 ≤m2 ≤ 10000,1 ≤ Si ≤ 2,000,000,000。
4.道路游戏
(game.pas/c/cpp)
【问题描述】
小新正在玩一个简单的电脑游戏。
游戏中有一条环形马路,马路上有n 个机器人工厂,两个相邻机器人工厂之间由一小段
马路连接。小新以某个机器人工厂为起点,按顺时针顺序依次将这n 个机器人工厂编号为
1~n,因为马路是环形的,所以第n 个机器人工厂和第1 个机器人工厂是由一段马路连接在
一起的。小新将连接机器人工厂的这n 段马路也编号为1~n,并规定第i 段马路连接第i 个
机器人工厂和第i+1 个机器人工厂(1 ≤ i ≤ n-1),第n 段马路连接第n 个机器人工厂和第1
个机器人工厂。
游戏过程中,每个单位时间内,每段马路上都会出现一些金币,金币的数量会随着时间
发生变化,即不同单位时间内同一段马路上出现的金币数量可能是不同的。小新需要机器人
的帮助才能收集到马路上的金币。所需的机器人必须在机器人工厂用一些金币来购买,机器
人一旦被购买,便会沿着环形马路按顺时针方向一直行走,在每个单位时间内行走一次,即
从当前所在的机器人工厂到达相邻的下一个机器人工厂,并将经过的马路上的所有金币收集
给小新,例如,小新在i(1 ≤ i ≤ n)号机器人工厂购买了一个机器人,这个机器人会从i 号
机器人工厂开始,顺时针在马路上行走,第一次行走会经过i 号马路,到达i+1 号机器人工
厂(如果i=n,机器人会到达第1 个机器人工厂),并将i 号马路上的所有金币收集给小新。
游戏中,环形马路上不能同时存在2 个或者2 个以上的机器人,并且每个机器人最多能
够在环形马路上行走p 次。小新购买机器人的同时,需要给这个机器人设定行走次数,行走
次数可以为1~p 之间的任意整数。当马路上的机器人行走完规定的次数之后会自动消失,小
新必须立刻在任意一个机器人工厂中购买一个新的机器人,并给新的机器人设定新的行走次
数。
以下是游戏的一些补充说明:
1. 游戏从小新第一次购买机器人开始计时。
2. 购买机器人和设定机器人的行走次数是瞬间完成的,不需要花费时间。
3. 购买机器人和机器人行走是两个独立的过程,机器人行走时不能购买机器人,购买
完机器人并且设定机器人行走次数之后机器人才能行走。
4. 在同一个机器人工厂购买机器人的花费是相同的,但是在不同机器人工厂购买机器
人的花费不一定相同。
5. 购买机器人花费的金币,在游戏结束时再从小新收集的金币中扣除,所以在游戏过
程中小新不用担心因金币不足,无法购买机器人而导致游戏无法进行。也因为如此,
游戏结束后,收集的金币数量可能为负。
现在已知每段马路上每个单位时间内出现的金币数量和在每个机器人工厂购买机器人
需要的花费,请你告诉小新,经过m 个单位时间后,扣除购买机器人的花费,小新最多能
收集到多少金币。
【输入】
输入文件名为 game.in。
第一行 3 个正整数,n,m,p,意义如题目所述。
接下来的 n 行,每行有m 个正整数,每两个整数之间用一个空格隔开,其中第i 行描
述了i 号马路上每个单位时间内出现的金币数量(1 ≤ 金币数量≤ 100),即第i 行的第j
(1 ≤ j ≤m)个数表示第j 个单位时间内i 号马路上出现的金币数量。
最后一行,有 n 个整数,每两个整数之间用一个空格隔开,其中第i 个数表示在i 号机
器人工厂购买机器人需要花费的金币数量(1 ≤ 金币数量≤ 100)。
【输出】
输出文件 game.out 共一行,包含1 个整数,表示在m 个单位时间内,扣除购买机器人
花费的金币之后,小新最多能收集到多少金币。
【输入输出样例】
game.in game.out
2 3 2
1 2 3
2 3 4
1 2
5
【数据范围】
对于 40%的数据,2 ≤ n ≤ 40,1 ≤m≤ 40。
对于 90%的数据,2 ≤ n ≤ 200,1 ≤m≤ 200。
对于 100%的数据,2 ≤ n ≤ 1000,1 ≤m≤ 1000,1 ≤ p ≤m

以上是关于noip提高组的C语言历届复赛试题的主要内容,如果未能解决你的问题,请参考以下文章

如何评价NOIP2015提高组复赛试题

如何评价NOIP2015提高组复赛试题

2006NOIP普及组试题

如何评价NOIP2015提高组复赛试题

急求NOIP2009普及组试题

noip2010提高组复赛第一题(被大牛们称为水题)不会做!