noip普及组复赛模拟试题7(答案)

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

【试题描述】

给出一个正整数n,然后对n进行一系列处理,处理用以下代码表示:

0不做任何处理

1对原数加上100,若加上100后大于1000,则再减去1000.

2对原数减去100,若减去100后小于0,则再加上200

3对原数除2取整

4对原数乘4,若乘4之后大于1000,则除以1000取余数。

问题:输入n,k后,将n作为原数(1≤n <1000),k为处理码的十进制表示(1<k ≤30000)。要求将k化为五进制的数,然后以该五进制数从高位到低位的顺序,分别将每位数字作为处理码对原数按上述规则进行处理,求处理后的结果。

【输入描述】n k (2个整数)

【输出描述】处理后的结果

【输入样例】33 247

【输出样例】28

【解题提示】

样例说明:

k=247 化为五进制数:1442,则处理系列为:

133+100=133

4133*4=532

4 532*4=2128 (除以1000取余数,成为128)

2128-100=28

所以输出28

program ex1764;

var n,k,i,t,l:integer;

st1,st2:string;

begin

readln(n,k);

st2:='';

repeat

t:=k mod 5;

str(t,st1);

st2:=st1+st2;

k:=k div 5;

until k=0;

l:=length(st2);

for i:=1 to l do

case st2[i] of

'1':begin n:=n+100; if n>1000 then n:=n-1000;end;

'2':begin n:=n-100;if n<0 then n:=n+200; end;

'3':begin n:=n div 2; end;

'4':begin n:=n*4;if n>1000 then n:=n mod 1000;end;

end;

writeln(n);

end.

输入56 1249 输出936 输入512 20000 输出612

输入1000 30000 输出200

Description

《贫民窟的百万富翁》获得2009年美国奥斯卡最佳影片,影片的主人公是一个叫贾马尔的小男孩,他在贫民窟长大,后来他参加了一档印度版的《谁想成为百万富翁》电视直播节目,他的特殊成长经历居然使他能够回答这个节目中的每一个问题,最后成功获得百万奖金。其中有一个题目是这样的:读入四个整数(0<每个整数<50000),判断这四个整数能否构成连续的四个奇数,如果可以就输出三行,每行一个等式,每个等式都满足“前一个数+2=后一个数”,否则请将这四个整数从大到小输出(数据之间以一个空格隔开)。

Input 一行,四个空格隔开的整数。(0 < 每个整数< 50000 )

Output

三行,每行一个等式或

一行,从大到小排列的4个数

Sample Input

样例1:

17 13 11 15

样例2:

18 13 11 16

Sample Output

样例1:

11+2=13

13+2=15

15+2=17

样例2:

18 16 13 11

Hint

样例1中17、13、11、15可以构成连续的四个奇数11、13、15、17,所以就输出三个等式。样例2中的四个数据18、13、11、16不能构成连续的四个奇数,所以将他们从大到小输出。

program ex1285;

var a:array[1..4] of longint;

t:longint;

i,j:integer;

begin

for i:=1 to 4 do

read(a[i]);

readln;

for i:=1 to 3 do

for j:=i+1 to 4 do

if a[i]>a[j] then begin t:=a[i];a[i]:=a[j];a[j]:=t; end;

i:=1;

while (i<4) and (a[i]+2=a[i+1]) do inc(i);

if (i=4) and (a[1] mod 2<>0) then

begin

writeln(a[1],'+',2,'=',a[2]);

writeln(a[2],'+',2,'=',a[3]);

writeln(a[3],'+',2,'=',a[4]);

exit;

end;

for i:=4 downto 1 do

write(a[i],' ');

end.

输入 212 218 216 214 输出 218 216 214 212

输入 10057 10063 10061 10059

输出 10057+2=10059

10059+2=10061

10061+2=10063

【问题描述】

某片矿区含有丰富的矿产资源,有金银铜铁锡等,还有钻石呢。很多人前去淘金。你现在手上有一笔资金,可买到该矿山面积为S平方米的地域进行开采,你通过秘密途径搞到一份绝密资料,那就是该矿山的资源分布图。有了这些资料后,你准备买下哪块地进行开采,才能得到最大的效益。

【输入格式】

第一行为一个整数N(N<=100),表示矿山的边长。接下来是矿山的资源分布图,按单位平方米标记了每个点开采的价值,若为负数,表示开采将会亏本。最后一行为一个整数S,表示你可开采的面积(S<10000)

【输出格式】

输出开采后你的最大收益,注意你最大可以买S,你也可以买小于S的面积。为了规划,买的地域必须成矩形。

【输入样例】treasure.in

3

1 2 3

-1 2 4

-3 -2 3

4

【输出样例】treasure.out

11

枚举每一个矩形左上角的点,再枚举矩形的长和宽,计算最大值就可解决定义一个a[i,j],表示从点(1,1)到点(i,j)的矩阵之和,这样做可以使运算简单

var n,i,j,k,k1,max,s,s1,i1:longint;

g,a:array[0..100,0..100] of longint;

begin

assign(input,'treasure.in'); assign(output,'treasure.out');

reset(input); rewrite(output);

readln(n);

for i:=1 to n do

相关文档
最新文档