c语言/c++编程 之 暗号传递

题目描述

Jarily与一群小屁孩玩一个名叫”暗号传递”的游戏,获得胜利的人将会得到Jarily送出的精美奖励。
在一条笔直的百米跑道上,随机站着一群小屁孩,他们的方向有的面对起点有的面对终点,每个小屁孩都只能沿着他们前面的方向前进,速度为1米/秒。当两个小屁孩碰面时他们会同时掉头往相反的方向前进。
当一个小屁孩跑出起点或终点则他停止游戏,当所有的小屁孩都跑出起点或终点则游戏结束。
现在Jarily在游戏开始前会把一个暗号告诉其中一个小屁孩。
当两个小屁孩碰面时,知道暗号的人则会把暗号分享给对方,当游戏结束时,所有知道暗号的小屁孩都为获胜者。
忽略小屁孩分享暗号和掉头转向所花费的时间,且每个小屁孩初始状态距离起点的距离都是整数。不会出现两个人初始时站在同一个位置的情况,也不会出现有人站在起点的情况。
现在要你编程求出游戏结束后获得胜利的人数。

输入

第一行输入为一个正整数N,表示一共有N个小屁孩参加游戏,N的数量不会超过50。
接下会输入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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值