标签:
问题来源:第五届蓝桥预赛本科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
例题:
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 }
01_蚂蚁感冒(第五届蓝桥预赛本科B组第8题 nyoj 990)
标签:
原文地址:http://www.cnblogs.com/ruo-yu/p/4393950.html