解题思路:
刚看到题目时觉得很复杂。在推倒例子时意外发现其实可以看做在碰面时,蚂蚁穿过对方,且感染对方。这道题只是需要得知蚂蚁感冒的数目,如果需要知道具体是那只,只需在穿过时交换号码即可。(刚开始发现还很高兴,后来发现原来大家都是这么做)
注意事项:
要算上原来的第一只蚂蚁所以ans=1
可能的错误:
if(k>0){ for(int i=2;i<=n;i++){ if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的 if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的且与a[1]同向会被“从a[1]对面来的且被传染的”传染 } }
你这里可能会这么写。这样明显不对。因为你不能两个同时确定,但凡有一只“从a[1]对面来的且被传染的”的在a[1]后面的且与a[1]同向的都会被感染,但是你如果同时扫描,就可能漏掉。
代码虽然粗糙,但是易想到。
参考代码:
#include<iostream> #include<cmath> using namespace std; int main(){ int n; int ans=1; int b=0; cin>>n; int a[101]; for(int i=1;i<=n;++i){ cin>>a[i]; } int k=a[1]; if(k>0){ for(int i=2;i<=n;i++){ if(a[i]<0&&abs(a[i])>k) ans++,b=1; // b=1证明有从a[1]对面来的且被传染的 } for(int i=2;i<=n;i++){ if(b==1&&a[i]>0&&a[i]<k) ans++; // 在a[1]后面的会被“从a[1]对面来的且被传染的”传染 } } if(k<0){ for(int i=2;i<=n;i++){ if(a[i]>0&&abs(a[i])<-k) ans++,b=1; } for(int i=2;i<=n;i++){ if(b==1&&a[i]<0&&abs(a[i])>-k) ans++; } } cout<<ans; return 0; }
0.0分
5 人评分
兰顿蚂蚁 (C++代码)浏览:1091 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:530 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:748 |
剪刀石头布 (C++代码)浏览:1703 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:795 |
母牛的故事 (C语言代码)浏览:496 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:501 |
母牛的故事 (C语言代码)浏览:482 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:855 |
【蟠桃记】 (C语言代码)浏览:627 |