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 }

 

posted @ 2021-02-24 15:52  acmloser  阅读(74)  评论(0编辑  收藏  举报