题目描述
Jarily与一群小屁孩玩一个名叫”暗号传递”的游戏,获得胜利的人将会得到Jarily送出的精美奖励。
在一条笔直的百米跑道上,随机站着一群小屁孩,他们的方向有的面对起点有的面对终点,每个小屁孩都只能沿着他们前面的方向前进,速度为1米/秒。当两个小屁孩碰面时他们会同时掉头往相反的方向前进。
当一个小屁孩跑出起点或终点则他停止游戏,当所有的小屁孩都跑出起点或终点则游戏结束。
现在Jarily在游戏开始前会把一个暗号告诉其中一个小屁孩。
当两个小屁孩碰面时,知道暗号的人则会把暗号分享给对方,当游戏结束时,所有知道暗号的小屁孩都为获胜者。
忽略小屁孩分享暗号和掉头转向所花费的时间,且每个小屁孩初始状态距离起点的距离都是整数。不会出现两个人初始时站在同一个位置的情况,也不会出现有人站在起点的情况。
现在要你编程求出游戏结束后获得胜利的人数。
在一条笔直的百米跑道上,随机站着一群小屁孩,他们的方向有的面对起点有的面对终点,每个小屁孩都只能沿着他们前面的方向前进,速度为1米/秒。当两个小屁孩碰面时他们会同时掉头往相反的方向前进。
当一个小屁孩跑出起点或终点则他停止游戏,当所有的小屁孩都跑出起点或终点则游戏结束。
现在Jarily在游戏开始前会把一个暗号告诉其中一个小屁孩。
当两个小屁孩碰面时,知道暗号的人则会把暗号分享给对方,当游戏结束时,所有知道暗号的小屁孩都为获胜者。
忽略小屁孩分享暗号和掉头转向所花费的时间,且每个小屁孩初始状态距离起点的距离都是整数。不会出现两个人初始时站在同一个位置的情况,也不会出现有人站在起点的情况。
现在要你编程求出游戏结束后获得胜利的人数。
输入
第一行输入为一个正整数N,表示一共有N个小屁孩参加游戏,N的数量不会超过50。
接下会输入N个用空格隔开的整数,这些整数的绝对值表示每个小屁孩距离起点的距离,正值表示小屁孩的方向是面向终点,负值表示方向面向起点。
这N个数中假设第一个为知道暗号的小屁孩。
接下会输入N个用空格隔开的整数,这些整数的绝对值表示每个小屁孩距离起点的距离,正值表示小屁孩的方向是面向终点,负值表示方向面向起点。
这N个数中假设第一个为知道暗号的小屁孩。
输出
输出为一个整数,表示获胜的人数。
样例输入
5
-10 8 -20 12 25
样例输出
3
分析:先按绝对值排序,再从第一个知道信号的小屁孩两边分别遍历
AC代码如下:
#include "iostream"
#include "cstdio"
#include "cmath"
#include "algorithm"
using namespace std;
struct stru{
int x;
int y;
}a[51];
int cmp(stru a,stru b)//按绝对值大小排序
{
return a.y<b.y;
}
int main(int argc, char* argv[])
{
int n,i,flag,num=1;
cin>>n;
for (i=0;i<n;i++){
cin>>a[i].x;
a[i].y=abs(a[i].x);
}
int first=a[0].x;//标记第一个知道暗号的小屁孩
sort(a,a+n,cmp);//按绝对值大小排序
for (i=0;i<n;i++){
if (a[i].x==first) flag=i;//标记第一个知道暗号的小屁孩的下标
}
num=1;
if (a[flag].x>0){//判断第一个知道暗号的小屁孩前进的初始方向
int ff=0;
for (i=flag+1;i<n;i++){//从这个小屁孩右边遍历
if (a[i].x<0){ //累计方向与他相反的人数
ff=1; num++;
}
}
if (!ff){ //若没有方向与他相反的人,则信号不能传递,输出1
cout<<1<<endl; return 0;
}
for(i=0;i<flag;i++){ //从这个小屁孩右边遍历
if (a[i].x>0) num++;
}
}
else if (a[flag].x<0)
{
int ff=0;
for(i=0;i<flag;i++){
if (a[i].x>0){
ff=1; num++;
}
}
if (!ff){
cout<<1<<endl; return 0;
}
for (i=flag+1;i<n;i++){
if (a[i].x<0) num++;
}
}
cout<<num<<endl;
return 0;
}