唉,自己根据题目模拟蚂蚁只得了40分,看的别人答案才发现可以把碰头的蚂蚁掉头看成穿过!且因为速度相同,不存在追上的问题;
这样问题就变得很简单了;
此时题目给出的100cm的长度就已经可以忽略了,即使是无限长,被感染的蚂蚁数量也不变;
因为不用思考每只蚂蚁掉头的后的复杂情况,所以一开始只要是跟感染源对着走的蚂蚁就会被感染;
例如第一只蚂蚁x = 10 是感染源,向右走,那么在x右边的且向左走的蚂蚁就一定会遇见x,就一定会被感染,
接着右边的蚂蚁继续向左走,那么在x左边的且向右走的蚂蚁就一定会跟他们相遇
特殊情况,当x的右边没有向左走的蚂蚁时,即在x的右边包括x在内都是向右走的,那么他们就一直保持原来的距离一直走,
永远不可能相遇感染,那么在x左边的蚂蚁也永远不可能追上x被感染;
所以,当x > 0时,x左边的蚂蚁被感染的条件是 : x右边有被感染的的蚂蚁
#include<iostream> #include<algorithm> using namespace std; int main(){ int n; int ans = 1;//加上感染源 int a[55]; cin>>n; for(int i = 0; i < n; i++){ cin>>a[i]; } int x = a[0]; if(x > 0){ for(int i = 1; i < n; i++){ if(abs(a[i]) > x){ if(a[i] < 0){ ans++; } } } if(ans > 0){ //当右边有被感染的,左边的才能被感染 for(int i = 1; i < n; i++){ if(abs(a[i]) < x){ if(a[i] > 0){ ans++; } } } } } if(x < 0){ for(int i = 1; i < n; i++){ if(abs(a[i]) < abs(x)){ if(a[i] > 0){ ans++; } } } if(ans > 0){ //当左边有被感染的,右边的才能被感染 for(int i = 1; i < n; i++){ if(abs(a[i]) > abs(x)){ if(a[i] < 0){ ans++; } } } } } cout<<ans; return 0; }
下面的时我模拟的蚂蚁,只得了四十分,我也找不到哪里有问题
#include<iostream> #include<algorithm> using namespace std; int a[10000]; int vis[10000];//感冒 int v[10000];//是否走出去了 int n, ans; int f(){//是否全走出来了 for(int i = 0; i < n; i++){ if(v[i] == 0){ return 0; } } return 1; } void ff(){//检测碰头并掉头 int b[10000] = {0}; // 记录已经碰头并掉头的,避免重复掉头 for(int i = 0; i < n - 1; i++){ if(!b[i]){ for(int j = i + 1; j < n; j++){ if(!b[j]){ if(abs(a[i]) == abs(a[j]) + 1 || abs(a[i]) == abs(a[j]) - 1){// if(vis[i] || vis[j]){ vis[i] = 1; vis[j] = 1; } a[i] = -a[i]; a[j] = -a[j]; b[i] = 1; b[j] = 1; break; } } } } } } int main() { ff(); vis[0] = 1; cin>>n; for(int i = 0; i < n; i++){ cin>>a[i]; } while(!f()){ for(int i = 0; i < n; i++){ if(!v[i]){ //a[i]++; if(a[i] > 0){ a[i]++; } if(a[i] < 0){ a[i]--;//这是我一开始没考虑好,认为向左走就是a--,但是我后来发现还是a++,但是改成a++就是0分,不懂了 } if(a[i] == 0 || abs(a[i]) == 100){ v[i] = 1; } } } ff(); } for(int i = 0; i < n; i++){ if(vis[i]){ ans++; } } cout<<ans; return 0; }
0.0分
1 人评分
C语言训练-计算1977!* (C++代码)浏览:907 |
A+B for Input-Output Practice (VII) (C++代码)浏览:643 |
不容易系列 (C语言代码)浏览:702 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:778 |
C语言程序设计教程(第三版)课后习题6.6 (C语言代码)浏览:366 |
printf基础练习2 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:524 |
简单的a+b (C语言代码)浏览:574 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:522 |
P1002 (C语言代码)浏览:1028 |