01_蚂蚁感冒(第五届蓝桥预赛本科B组第8题 nyoj 990)

问题来源:第五届蓝桥预赛本科B组第8题

问题描述:有在一条定长(100cm)的直杆上有n(1<n<50)只蚂蚁(每只蚂蚁的起点都不一样),他们都以相同的速度(1cm/s)向左或者向右爬, 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。 这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

问题分析:1.两只蚂蚁碰面时,往相反方向爬行,等价于两只蚂蚁相遇后继续爬行(只不过换了蚂蚁)。

       2.如果感冒蚂蚁(sta)向左爬,他会感染他左边向右爬的所有蚂蚁(数量记为left),其中如果left!=0,这些蚂蚁又会感染sta右边的向左爬的所以蚂蚁(数量记为right)

       3.如果感冒蚂蚁(sta)向右爬,他会感染他右边向左爬的所有蚂蚁(数量记为right),其中如果right!=0,这些蚂蚁又会感染sta左边的向右爬的所以蚂蚁(数量记为left)

例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=990

例题:

蚂蚁感冒

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述
  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。 这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入
  第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
  接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出
  要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3
5 -2 8
5
-10 8 -20 12 25
样例输出
1
3

代码实现:

 1 #include "stdio.h"
 2 #include "string.h"
 3 #include "stdlib.h"
 4
 5 #define N 55
 6 int a[N];
 7
 8 struct node
 9 {
10     int x;
11     int Di;
12 } Point[N],sta;
13
14 int cmp(const void *a,const void *b)
15 {
16     struct node *c = (node *)a;
17     struct node *d = (node *)b;
18     return c->x - d->x;
19 }
20
21
22 int main()
23 {
24     int i,n;
25     int ans;
26     int left,right;
27     while(scanf("%d",&n)!=EOF)
28     {
29         ans = 1;  //自身感冒了!
30         for(i=0; i<n; i++)
31         {
32             scanf("%d",&a[i]);
33             if(a[i]<0)
34                 Point[i].x = -a[i],Point[i].Di = -1;
35             else
36                 Point[i].x = a[i], Point[i].Di = 1;
37         }
38         sta.x = Point[0].x;
39         sta.Di = Point[0].Di;
40         qsort(Point,n,sizeof(Point[0]),cmp);
41         left = right = 0;
42         for(i=0; Point[i].x<sta.x; i++) //left:统计在感冒蚂蚁sta左边的向右爬的蚂蚁数
43         {
44             if(Point[i].Di==1)
45                 left++;
46         }
47         for(i++; i<n; i++) //right:统计在感冒蚂蚁sta右边的向左爬的蚂蚁数
48         {
49             if(Point[i].Di==-1)
50                 right++;
51         }
52         if(sta.Di==-1 && left!=0) //感冒蚂蚁sta向左爬
53             ans += left + right;
54         else if(sta.Di==1 && right!=0) //感冒蚂蚁sta向右爬
55             ans += left + right;
56         printf("%d\n",ans);
57     }
58     return 0;
59 }

时间: 2024-10-27 13:26:32

01_蚂蚁感冒(第五届蓝桥预赛本科B组第8题 nyoj 990)的相关文章

蚂蚁感冒---第五届蓝桥杯

蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. [数据格式] 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi

第五届蓝桥杯C/C++本科B组(真题试做)(6~8)

终于考完--不过挂科的铁定的了. 还是来做题吧. 前面八道题做起来都很简单. F: 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8

算法笔记_111:第五届蓝桥杯软件类省赛真题(Java本科A组)试题解答

 目录 1 猜年龄 2 李白打酒 3 神奇算式 4 写日志 5 锦标赛 6 六角填数 7 绳圈 8 兰顿蚂蚁 9 斐波那契 10 波动数列   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 猜年龄 标题:猜年龄 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍".小明又补充说:"她们可不是双胞胎,年龄差肯定也不超过8岁啊." 请你写出:小明的较小的妹妹的年龄. 注意: 只写一个人的年龄数

第五届蓝桥杯C/C++本科B组(真题试做)(1~5)

菜鸡只能报个B组.于是报了第六届的本科B.就找了上届的本科B的题来做做. A: 标题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提交答案. 不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等). 对于这种,我直接暴力了. double a=2.3,b=1.9; FOR(j,0,SIZE) FOR(i,0,j) { if(abs(a*i+b*

第五届蓝桥杯C/C++本科B组(真题试做)(9~10)

第九题 迷宫取宝 标题:地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿). 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明. 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝. [数据格式] 输入

第六届蓝桥杯本科B组C++省赛题解

比赛结束已经一星期了,成绩也出来了,江苏非211组的省前十,但是深感自己还是有太多的不足.绝对不能以自己还只是大一为借口,acm这条路还长的很. 目测得了95分(满分150),第一题错了,代码填空第一题错了,倒数第二题扣了一点分,最后一道大题全错. 之所以会这么晚来发这道题解,是因为深感自己不足,倒数第二题之所以没有做出来,是因为自己居然不会用[矩阵快速幂].因此,现学现用以自省. 关于题目:所有填空题都可以纯暴力,只要会回溯剪枝法对于蓝桥杯已经足够了.大题目难度一年比一年高 第一题 结果填空

第七届蓝桥杯本科B组省赛

煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), -. 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 思路: 推出第i层有i*(i+1)/2个煤球,累加到100层即可,答案为171700 #include <bits/stdc++.h> using namespace std; int main() {

[JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第四题:二阶魔方]

[题目取自CSDN-671coder] 第四题:二阶魔方 题目描述: 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示) 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向:白 z轴反向:黄 假设我们规定,只能对该魔方进行3种操作.分别标记为: x 表示在x轴正向做顺时针旋转 y 表示在y轴正向做顺时针旋转 z 表示在z轴正向做顺时针旋转 基本旋转后的效果如图2,3,4所示. xyz 则表示顺序执行x,

第四届(13年)蓝桥杯java B组决赛真题

1.标题:猜灯谜(填空) A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜        小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字.        请你用计算机按小明的思路算一下,然后提交"请猜谜"三个字所代表的整数即可. 请严格按照格式,通过浏览器提交答案.    注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字. 1 import java.util.Scanner; 2 //猜灯谜 3 public class Main{