【世博会攻略-2】(3+3+3+3+3+3=18分)
世博会中,有些展馆虽然不必排队(或者排队时间很短),但没什么可看的;有些展馆虽然排队等候时间很长,但太值得看了(比如,我们的中国馆)。
味子是个喜欢保质保量的人,她现在有12 小时的游览时间,她希望在这12 小时中游览4 个展馆(为 方便,我们不计味子在各展馆之间走路和游览的时间),但这 个展馆不能是没什么可看的。于是,她收集了每个展馆需要排队的时间,为每个展馆设定了可看指数(指数越高越值得看)。现在她想统计一 下12 小时内分别可以游览哪4 个展馆,这4 个展馆必须满足下列条件:
(1) 4 个展馆的排队时间总和不能超过12小时
(2) 这4个展馆的可看指数总和不能小于10。
(3) 任何一个展馆的可看指数都必须不小于2。
满足上述条件的每4 个展馆称为一组(展馆编号相同但顺序不同的情况视为相同。比如,“1、3、5、 6”和:“5、6、1、3”我们认为是同一种方案),味子用下列程序用来统计满足条件的组数,请完善程。
输入数据第一行只有一个整数n(n<=300),表示总的展馆数量。第二行有n个用空格分隔的整数, 依次表示每个展馆的排队时间。第三行有n 个用空格分隔的整数,表示每个展馆的可看指数。
输出数据第一行只有一个整数ans,表示满足条件的方案总数。接下来共有ans 行,每行表示满足条 件的一组展馆的编号。
输入样例 1:
12
6 4 2 5 1 0 3 2 4 4 3 5
5 2 1 4 1 1 2 2 3 4 1 2
输出样例1:
0 //表示没有任何4个展馆满足条件
输入样例2:
8
4 3 2 3 1 0 3 2
5 2 1 4 1 1 2 2
输出样例2:
4
1 2 4 8
1 2 7 8
1 4 7 8
2 4 7 8
//编号为“1、2、4、8”等4组展馆满足条件
program test_1006;
var
n,i,j,ans:integer;
a,p:array[1..300] of integer;
f:array[1..100,1..4] of integer;
procedure init;
var i,j:integer;
begin
readln(n);
for i:=1 to n do read(a[i]);
readln;
for i:=1 to n do read( p[i] );
for i:=1 to 100 do for j:=1 to 4 do f[i,j]:=0;
ans:=0;
end;
procedure work;
var
i,j,x1,x2,x3,x4:integer;
begin
for x1:=1 to n-3 do
if p[x1]>=2 then begin
for x2:=x1+1 to n-2 do
if p[x2]>=2 then begin
for x3:=x2+1 to n-1 do
if p[x3]>=2 then begin
for x4:=x3+1 to n do
if (p[x4]>=2) and (a[x1]+a[x2]+a[x3]+a[x4]<=12) and ( p[x1]+p[x2]+p[x3]+p[x4]>=10 ) then
begin
inc(ans) ;f[ans,1]:=x1;f[ans,2]:=x2;f[ans,3]:=x3;f[ans,4]:=x4;
end;
end;
end;
end;
end;
procedure out;
var
i,j:integer;
begin
writeln(ans);
for i:=1 to ans do
begin
for j:=1 to 4 do write( f[i,j] ,’ ’);
writeln;
end;
end;
begin {main}
init;
work ;
out;
end.