noip普及组复赛模拟试题7(答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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