noip普及组复赛模拟试题13答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
越野跑
【描述】
为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练。
贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:
奶牛独自进山的时间不得超过M秒(1 <=M<=10,000,000)。
整条山路被贝茜划分成T个长度相同的小段(1 <= T <= 100,000),并且,贝茜用S_i表示第i个小段的路况。
S_i为u,f,d这3个字母之一,它们分别表示
第i个小段是上坡、平地,或是下坡。
贝茜要花U秒(1<=U<=100)才能跑完一段上坡路,跑完一段平地的耗时是F 秒(1<=F<=100),跑完一段下坡路要花D秒(1<=D<=100)。
注意,沿山路原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成
了上坡路。
贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。
【输入格式】
* 第1行: 5个用空格隔开的整数:M,T,U,F,以及D
*第2..T+1行:第i+1行为1个字母S_i,描述了第i段山路的路况
【输出格式】
*第1行:输出1个整数,为贝茜在按时回到农场的前提下,最多能跑到多远
【样例输入】
13 5 3 2 1
u
f
u
d
f
【样例输出】
3
【题解】
模拟一下跑步的过程。
用s记录跑到第i段路并返回的时间
若s=m则输出i并退出,若s>m则输出I-1并退出。
【参考程序】
program dfjk;
var i,s,m,t,u,f,d:longint;
a:array[1..100000]of char;
begin
readln(m,t,u,f,d);
for i:=1 to t do
readln(a[i]);
s:=0;
for i:=1 to t do
begin
case a[i] of
'u':s:=s+u+d;
'f':s:=s+2*f;
'd':s:=s+u+d;
end;
if s>=m then break;
end;
if s=m then writeln(i);
if s>m then writeln(i-1);
end.
输入85 6 23 12 31
u
f
d
f
d
u 输出2
输入985 10 430 325 314
u
f
d
f
d
u
f
u
u
d
输出1
数字反转(reverse.pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。
新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
(参见样例2)
【输入】输入文件名为reverse.in。
输入共一行,一个整数n。
【输出】输出文件名为reverse.out。
输出共一行,一个整数,表示反转后的新数。
【输入输出样例1】
reverse.in reverse.out
123 321
【输入输出样例2】
reverse.in reverse.out
-380 -83
【数据范围】 -1,000,000,000≤N≤1,000,000,000。
【程序】
Var i,j,l:longint; n,a:string;
Begin readln(n); L:=length(n);
j:=1; if n='0' then begin write('0'); exit; end;
if n[1]='-' then begin
a[1]:=n[1];
write(a[1]);
end; for i:=L downto 1 do begin
inc(j); a[j]:=n[i];
end;
i:=2; while a[i]='0' do inc(i);
if a[1]='-' then begin
for j:= i to l do
write(a[j])
end else begin
for j:=i to l+1 do
write(a[j]);
end; End.
输入 -290 输出 -92
253717 输出 717352 输入-800901860 输出-68109008
【问题描述】
最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N 个建筑。
afy决定在上面找一块尽可能大的矩形放置广告牌。
我们假设每个建筑物都有一个高度,从左到右给出每个建筑物的高度H1,H2…HN,且0<Hi<=1,000,000,000,并且我们假设每个建筑物的宽度?。
要求输出广告牌的最大面积。
【输入文件】
中的第一行是一个数n (n<= 400,000 )
第二行是n个数,分别表示每个建筑物高度H1,H2…HN,且0<Hi<=1,000,000,000。
【输出文件】
输出文件ad.out 中一共有一行,表示广告牌的最大面积。
【输入样例】
6
5 8 4 4 8 4
【输出样例】
24
【解释】各个测试点一秒,
但就这道题来说,n<= 400,000,我们如果用枚举不会过全部数据,我们应设计出o(n)的算法来解决,这是单调队列就可以派上用场了。
具体做法是先正着扫一遍,再倒着扫一遍,找到每一个数的右极限与左极限,最后找出最大值。
var temp,ans:int64;
n,p,q,i,j:longint;
a:array[0..400000] of longint;
b,r,l:array[0..400000] of longint;
begin
fillchar(b,sizeof(b),0);
readln(n);
for i:=1 to n do
read(a[i]);
p:=1;q:=0;
for i:=1 to n+1 do
begin
while (p<=q) and (a[i]<a[b[q]]) do
begin
r[b[q]]:=i;
dec(q);
end;
inc(q);b[q]:=i;
end;
fillchar(b,sizeof(b),0);
p:=1;q:=0;
for i:=n downto 0 do
begin
while (p<=q) and (a[i]<a[b[q]]) do
begin
l[b[q]]:=i;
dec(q);
end;
inc(q);b[q]:=i;
end;
for i:=1 to n do
begin
temp:=(r[i]-l[i]-1)*a[i];
if temp>ans then ans:=temp;
end;
writeln(ans);
end.
输入20
12 8 8 30 40 32 19 22 12 32 30 45 15 19 37 5 5 6 26 35 输出144
输入56
3000 2000 180 190 2890 2900 3120 450 560 500 300 2100 2300 480 840 880 890 350 550 450 760 960 860 250 260 1050 1130 1140 2140 2045 2065 3075 3155 3255 3470 3490 3240 920 930 900 930 980 890 740 760 770 825 845 855 950 1980 880 680 690 2380 2390
输出21080
Farmer John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛分配一个有效的密码。
一个有效的密码由L(3 <= L <= 15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至少有一个元音('a', 'e', 'i', 'o', 或'u')和两个辅音(除去元音以外的音节),并且是按字母表顺序出现的(例如,'abc'是有效的,而'bac'不是) 。
给定一个期望长度L和C个小写字母,写一个程序,打印出所有的长度为L、能由这给定的C个字母组成的有效密码。
密码必须按字母表顺序打印出来,一行一个。
你的程序只需输出前25,000个有效密码,即使后面还存在有效密码。
【输入】
第一行: 两个由空格分开的整数,L和C;
第二行: C个空格分开的小写字母,密码是由这个字母集中的字母来构建的。
【输出】
第一至?行: 每一个输出行包括一个长度为L个字符的密码(没有空格)。
输出
行必须按照字母顺序排列。
如果存在多于25,000个有效密码,你的程序必须在输出25,000个有效密码后停止。
【样例输入输出】
解法:纯碎的深搜吧............也就只有元音辅音的多少是要注意的了..........
var
a:array[0..28] of char;
y:set of char;
ch:char;
procedure dfs(i,t:longint;s:string);
var
yy,fy,j,j1:longint;
begin
if k=25000 then exit;
if t=l then begin
yy:=0;
fy:=0;
for j1:=1 to l do begin
if s[j1] in y then inc(yy)
else inc(fy);
end;
if (yy<1) or (fy<2) then exit;
inc(k);
writeln(s);
exit;
end;
for j:=i+1 to c-l+(t+1) do dfs(j,t+1,s+a[j]); end;
begin
assign(input,'passwd.in');
assign(output,'passwd.out');
reset(input);
rewrite(output);
readln(l,c);
for i:=1 to c-1 do read(a[i],ch);
read(a[c]);
y:=['a','e','i','o','u'];
for i:=1 to c-1 do begin
for j:=i+1 to c do begin
if a[i]>a[j] then begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
end;
end;
end;
for i:=1 to c-l+1 do begin
dfs(i,1,a[i]);
end;
close(input);
end.
输入6 8
a y c i s t w z
输出acistw acisty
acistz
aciswy
aciswz
acisyz
acitwy
acitwz
acityz
aciwyz acstwy
acstwz
acstyz
acswyz actwyz
aistwy
aistwz
aistyz
aiswyz
aitwyz
astwyz
cistwy
cistwz
cistyz
ciswyz
citwyz
istwyz
输入7 10
a y c i s t w z
b f 输出abcfist abcfisw abcfisy abcfisz abcfitw
abcfity
abcfitz abcfiwy abcfiwz abcfiyz abcfstw
abcfstz abcfswy abcfswz abcfsyz abcftwy abcftwz abcftyz abcfwyz abcistw abcisty abcistz abciswy abciswz abcisyz abcitwy abcitwz abcityz abciwyz abcstwy abcstwz abcstyz abcswyz abctwyz abfistw abfisty abfistz abfiswy abfiswz abfisyz abfitwy abfitwz abfityz abfiwyz abfstwy abfstwz abfstyz abfswyz abftwyz abistwy abistwz abistyz abiswyz abitwyz
acfistw acfisty acfistz acfiswy acfiswz acfisyz acfitwy acfitwz acfityz acfiwyz acfstwy acfstwz acfstyz acfswyz acftwyz acistwy acistwz acistyz aciswyz acitwyz acstwyz afistwy afistwz afistyz afiswyz afitwyz afstwyz aistwyz bcfistw bcfisty bcfistz bcfiswy bcfiswz bcfisyz bcfitwy bcfitwz bcfityz bcfiwyz bcistwy bcistwz bcistyz bciswyz bcitwyz
bfistwy bfistwz bfistyz bfiswyz bfitwyz bistwyz cfistwy cfistwz cfistyz cfiswyz cfitwyz cistwyz fistwyz。