2017.5.27测试 1. 排队

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.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值