题目链接
1211. 蚂蚁感冒 - AcWing题库
一些话
1.int l,r;//不能定义left,rightreference to 'left' is ambiguous
2. if(m > 0 && r == 0 || m < 0 && l == 0) puts("1");
// && 的 优先级高于 ||
切入点
// 这道题操作较为繁琐,咋一看是一道模拟题,按照模拟的思路写,写出伪代码等价替换后,就会发现这道题是一道脑经急转弯类的数学题
流程
模拟题等价替换:
// 比较难写的碰撞操作,因为碰撞时位置相同,感染情况相同,所以两只蚂蚁等价,可以认为蚂蚁没有碰撞而是直接调头了。
// 所以求出向母体靠近的蚂蚁数量,分为左右,如果左右都有的话,输出左右数量+母体,如果蚂蚁前进方向上没有蚂蚁靠近,输出1
套路
1.模拟题对比较难的地方进行等价替换
ac代码
// 一开始的思路 // 按绝对值排序,然后模拟1000个时间1000*n,每次循环检查数组内是否有绝对值相差为1的元素,有且在杆上则取反, // 如果有一只感染,一直没感染就计数,然后感染另一只然后然后判断正负符号进行移动操作, // 看题解后的思路 // 这道题操作较为繁琐,咋一看是一道模拟题,按照模拟的思路写,写出伪代码等价替换后,就会发现这道题是一道脑经急转弯类的数学题 // 比较难写的碰撞操作,因为碰撞时位置相同,感染情况相同,所以两只蚂蚁等价,可以认为蚂蚁没有碰撞而是直接调头了。 // 所以求出向母体靠近的蚂蚁数量,分为左右,如果左右都有的话,输出左右数量+母体,如果蚂蚁前进方向上没有蚂蚁靠近,输出1 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int l,r;//不能定义left,rightreference to 'left' is ambiguous int main(){ int n,m; cin >> n >> m; for(int i = 2;i <= n;i++){ int x; cin >> x; if(x > 0 && abs(x) < abs(m)) l ++; else if(abs(x) > abs(m) && x < 0) r++; } if(m > 0 && r == 0 || m < 0 && l == 0) puts("1"); // && 的 优先级高于 || else cout << l + r + 1 << endl; return 0; }