这题做了很久 一开始以为只有第一只感冒的蚂蚁(病原体)会传染人 后来发现每只蚂蚁都会传染人 于是考虑病原体感染第一只蚂蚁后的再用被感染后的蚂蚁去感染别人 想用递归的方法去做 后来发现太复杂了 不太现实 ,在我仔细研究题目和画图分析之后(这个精神确实需要 不要动不动就去看别人的答案)我发现如果病原体是 向左走的话,那么它的左边的所有蚂蚁都向右走的都会被感染,同理,如果病原体向右走,那么它右边的所有向左走的蚂蚁 都会被感染,因为向左走和向右走的蚂蚁可以看作是调换了位置(相当于穿过了对方的身体),因为考虑的是被感染 蚂蚁的数量,而不是具体的哪一只蚂蚁。这样就可以把感冒蚂蚁的总数看作为==左边向右走的蚂蚁+右边向左走的蚂蚁+ 被感染的蚂蚁本身(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分
6 人评分
C语言程序设计教程(第三版)课后习题11.12 (C语言代码)浏览:762 |
【密码】 (C语言代码)浏览:350 |
WU-蓝桥杯算法提高VIP-Quadratic Equation (C++代码)浏览:1808 |
Tom数 (C语言代码)浏览:581 |
理财计划 (C语言代码)浏览:494 |
输出九九乘法表 (C语言代码)浏览:1172 |
C语言程序设计教程(第三版)课后习题10.7 (用指针求解)浏览:1542 |
A+B for Input-Output Practice (III) (C语言代码)浏览:455 |
老王赛马 (C++代码)浏览:973 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:461 |
wu 2018-01-30 22:38:38 |
不会啊 但-25把它向左走的属性给了 20 向左走的蚂蚁的总数量不会变的