1085: 蚂蚁感冒
1085: 蚂蚁感冒
时间限制: 1 Sec 内存限制: 128 MB提交: 71 解决: 28
[提交][状态][讨论版]
题目描述
长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 /*两只蚂蚁相撞同时掉头可以看作穿过,第一只蚂蚁不管方向朝哪个方向,
2 它右边的蚂蚁只要向左走就可能碰撞感染(特殊情况除外),它左边的
3 蚂蚁只要朝右边走也可能被感染,可以得出公式
4 num = 左边蚂蚁向右走的数量+右边蚂蚁向左走的数量+第一只蚂蚁本身
5 特殊情况:
6 1.当第一只蚂蚁向左走的时候如果第一只蚂蚁左边没有向右爬行的蚂蚁,
7 那么不管第一只蚂蚁右边有多少向左爬行的,因爬行的速度相同则右边的蚂蚁永远不可能被感染
8 2.当第一只蚂蚁向右走的时候,如果第一只蚂蚁右边没有向左爬行的蚂蚁,
9 那么同样第一只蚂蚁左边也永远不可能感染*/
10 #include<iostream>
11
12 using namespace std;
13
14 int position[51];//记录每一个蚂蚁的初始位置
15 int direction[51];//0表示向左,1表示向右
16
17 int main(){
18 int n;
19 while(cin>>n){
20 int index;
21 for(int i=1;i<=n;i++){//处理输入数据进入数组
22 cin>>index;
23 if(index>0){
24 position[i]=index;
25 direction[i]=1;
26 }
27 else{
28 position[i]=-index;
29 direction[i]=0;
30 }
31 }
32 int p=position[1];
33 int d=direction[1];
34 if(d==1){//生病的蚂蚁往右爬,找出所有在其右边往左爬的,和在其左边往右爬的数量
35 int DLnum=0,DRnum=0;
36 for(int i=2;i<=n;i++){
37 //右边往左爬
38 if(position[i]>p&&direction[i]==0){
39 DLnum++;
40 }
41 //左边往右爬
42 else if(position[i]<p&&direction[i]==1){
43 DRnum++;
44 }
45 }
46 if(DRnum==0){
47 cout<<1<<endl;
48 continue;
49 }
50 cout<<DLnum+DRnum+1<<endl;
51
52 }
53 else if(d==0){//生病的蚂蚁往左爬,找出所有在其右边往左爬的,和在其左边往右爬的数量
54 int DLnum=0,DRnum=0;
55 for(int i=2;i<=n;i++){
56 //右边往左爬
57 if(position[i]>p&&direction[i]==0){
58 DLnum++;
59 }
60 //左边往右爬
61 else if(position[i]<p&&direction[i]==1){
62 DRnum++;
63 }
64 }
65 if(DLnum==0){
66 cout<<1<<endl;
67 continue;
68 }
69 cout<<DLnum+DRnum+1<<endl;
70 }
71
72 }
73 return 0;
74 }

浙公网安备 33010602011771号