AcWing 1211. 蚂蚁感冒
考察:模拟(?)
思路:
最关键的一点是要想到当两只蚂蚁碰面时,相当于它们穿过彼此.这道题两只蚂蚁只关心它们是否感冒,而不关心它们原本的序号.
再做一次WA了4次....注意一下坑点,我们只能感染与第一只蚂蚁同向且位置>第一只蚂蚁的.....
而且要判断到底能不能去感染右边的!!!!
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 const int N = 55; 6 struct ANT{ 7 int pos,dir; 8 bool ok; 9 bool operator<(ANT x) 10 { 11 return this->pos<x.pos; 12 } 13 }ants[N]; 14 int main() 15 { 16 int n,pos,id; 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++) 19 { 20 scanf("%d",&ants[i].pos); 21 ants[i].ok = 1; 22 if(i==1) pos = ants[i].pos,ants[i].ok = 0; 23 if(ants[i].pos<0) ants[i].dir = -1; 24 else ants[i].dir = 1; 25 ants[i].pos = abs(ants[i].pos); 26 } 27 sort(ants+1,ants+n+1); 28 for(int i=1;i<=n;i++) if(ants[i].pos==abs(pos)) id = i; 29 if(pos<0) 30 { 31 int t = -1; 32 for(int i=1;i<id;i++) 33 if(ants[i].dir!=ants[id].dir) ants[i].ok = 0,t = max(t,i); 34 if(t!=-1) 35 for(int i=id+1;i<=n;i++) 36 if(ants[i].dir!=ants[t].dir) ants[i].ok = 0; 37 }else{ 38 int t = n+1; 39 for(int i=id+1;i<=n;i++) 40 if(ants[i].dir!=ants[id].dir) ants[i].ok = 0,t = min(t,i); 41 if(t!=n+1) 42 for(int i=1;i<id;i++) 43 if(ants[i].dir!=ants[t].dir) ants[i].ok = 0; 44 } 45 int ans = 0; 46 for(int i=1;i<=n;i++) if(!ants[i].ok) ans++; 47 printf("%d\n",ans); 48 return 0; 49 }