原题链接:蓝桥杯历届试题-蚂蚁感冒
这题做了很久 一开始以为只有第一只感冒的蚂蚁(病原体)会传染人 后来发现每只蚂蚁都会传染人 于是考虑病原体感染第一只蚂蚁后的再用被感染后的蚂蚁去感染别人 想用递归的方法去做 后来发现太复杂了 不太现实 ,在我仔细研究题目和画图分析之后(这个精神确实需要 不要动不动就去看别人的答案)我发现如果病原体是 向左走的话,那么它的左边的所有蚂蚁都向右走的都会被感染,同理,如果病原体向右走,那么它右边的所有向左走的蚂蚁 都会被感染,因为向左走和向右走的蚂蚁可以看作是调换了位置(相当于穿过了对方的身体),因为考虑的是被感染 蚂蚁的数量,而不是具体的哪一只蚂蚁。这样就可以把感冒蚂蚁的总数看作为==左边向右走的蚂蚁+右边向左走的蚂蚁+ 被感染的蚂蚁本身(1),当然也有特殊情况就是,病原体的右边或者是左变全是跟它同一个方向的蚂蚁,那么感冒的蚂蚁 数量就是1,废话不多说,上代码:
#include<iostream> #include<algorithm> #include<cmath> using namespace std; void f(int a[],int flag,int n) { int sum1=0; int sum2=0; for(int j=flag-1;j>=0;j--)//从左往右走的蚂蚁数量 { if(a[j]>0) { sum1++; } } for(int j=flag+1;j<=n;j++)//从右往左走的蚂蚁数量 { if (a[j]<0) { sum2++; } } if(a[flag]<0&&sum1==0||a[flag]>0&&sum2==0) cout<<"1"<<endl;//特殊情况 else cout<<sum1+sum2+1<<endl; } int a[55]; int cmp(int a,int b) { return abs(a)<abs(b); } int main() { //freopen("data.in.txt","r",stdin); int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } int x=a[0]; sort(a,a+n,cmp); int flag; for(int i=0;i<n;i++) { if(a[i]==x) { flag=i; break; } } f(a,flag,n); return 0; }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复