1. 排队
(b.pas/cpp/c)
【题目描述】
小h和小n在给小朋友们排队,有n(1<n≤100)个小朋友,序号为1到n,每个小朋友自身带着一个号码,他们排成一列,但号码不一定是有序的,现在小n问小h,如果从队列中随机抽取m(1≤m<n)个小朋友出列,求剩下小朋友中相邻两个小朋友号码乘积的总和。
【输入格式】
第一行一个整数n。
第二行n个整数ai(1≤ai≤100),分别表示第1到i个小朋友的号码。
第三行一个整数m。
第四行m个整数,表示出列的小朋友的序号(原本的序号,也就是说之前的出列对每个小朋友的序号没有影响)。
【输出格式】
一行一个整数表示相邻两个小朋友号码乘积的总和。
【输入样例】
10
14 87 28 29 49 27 84 10 65 43
7
1 3 5 7 8 9 10
【输出样例】
3306
【样例解释】
去掉第1,3,5,7,8,9,10位置的数后,剩下的数为87 29 27,相邻两个小朋友号码乘积的总和为87*29+29*27=3306
var
a:array[0..100]of longint;
n,m,mm,i,x,y,t,ans:longint;
begin
assign(input,'b.in');reset(input);
assign(output,'b.out');rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
readln(m);
for i:=1 to m do
begin
read(mm);
a[mm]:=0;//去掉那个小朋友后,那里就没了
end;
for i:=1 to n do
if a[i]<>0 then begin//没被去掉
x:=i;y:=i+1;//找它后面离它最近的
while (a[y]=0) and (y<n) do inc(y);//去掉了,而且没越界就继续找
t:=a[x]*a[y];//乘积
ans:=ans+t;//总和
end;
writeln(ans);
close(input); close(output);
end.
该问题是关于一组编号的小朋友排队,从中随机移除部分小朋友后,计算剩余小朋友编号相邻两两乘积之和。需要通过编程算法解决此问题。

635

被折叠的 条评论
为什么被折叠?



