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.