AtCoder Beginner Contest 170

A:

找出第几位数是0.

 1 #include <iostream>
 2 using namespace std;
 3 int main(void)
 4 {
 5     for(int i=1;i<=5;i++)
 6     {
 7         int x;
 8         cin>>x;
 9         if(x==0)
10         {
11             cout<<i<<endl;
12         }
13     }
14     return 0;
15 }

B:

鸡兔同笼,判断是否合理。

 1 #include <iostream>
 2 using namespace std;
 3 int x,y;
 4 int main(void)
 5 {
 6     cin>>x>>y;
 7     if(4*x<y||y<2*x)cout<<"No"<<endl;
 8     else
 9     {
10         if((4*x-y)%2)cout<<"No"<<endl;
11         else cout<<"Yes"<<endl;
12     }
13     return 0;
14 }

C:

找出距离X最近的没有出现的数。注意答案可能是101.

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 int x,n,a[110];
 5 int main(void)
 6 {
 7     cin>>x>>n;
 8     for(int i=1;i<=n;i++)
 9     {
10         int y;
11         cin>>y;
12         a[y]=1;
13     }
14     int minn=110,now=110;
15     for(int i=105;i>=0;i--)
16     {
17         if(!a[i]&&(fabs(i-x)<minn||fabs(i-x)==minn&&i<now))
18         {
19             minn=fabs(i-x);
20             now=i;
21         }
22     }
23     cout<<now<<endl;
24 }

D:

找出数列中不是其他数的倍数的数的个数(拗口)。用小数筛大数。

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int n,a[2100000],ans;
 5 int main(void)
 6 {
 7     cin>>n;
 8     for(int i=1;i<=n;i++)
 9     {
10         int x;
11         cin>>x;
12         a[x]++;
13     }
14     for(int i=1;i<=1000000;i++)
15     {
16         if(a[i]==1)ans++;
17         if(a[i]>0)
18         {
19             for(int j=i;j<=1000000;j+=i)
20             {
21                 a[j]=0;
22             }
23         }
24     }
25     cout<<ans<<endl;
26 }

E:

对每次变换求所有集合最大值中的最小值。用s[]表示各个集合,m表示最大值集合,每次对集合元素删除加入。注意元素有可能相同,所以要用multiset.

 1 #include <iostream>
 2 #include <set>
 3 using namespace std;
 4 int a[210000],k[210000],n,q,num,to;
 5 multiset <int>s[210000];
 6 multiset <int>m;
 7 int main(void)
 8 {
 9     cin>>n>>q;
10     for(int i=1;i<=n;i++)
11     {
12         cin>>a[i]>>k[i];
13         s[k[i]].insert(a[i]);
14     }
15     for(int i=1;i<=200000;i++)
16     {
17  
18         if(s[i].size()>0)
19         {
20             m.insert(*(s[i].rbegin()));
21         }
22     }
23     for(int i=1;i<=q;i++)
24     {
25         cin>>num>>to;
26         m.erase(m.find(*s[k[num]].rbegin()));
27         s[k[num]].erase(s[k[num]].find(a[num]));
28         if(s[k[num]].size()>0)m.insert(*s[k[num]].rbegin());
29         if(s[to].size()>0)m.erase(m.find(*s[to].rbegin()));
30         s[to].insert(a[num]);
31         m.insert(*s[to].rbegin());
32         k[num]=to;
33         cout<<*(m.begin())<<endl;
34     }
35     return 0;
36 }

F:

bfs模拟,要注意方向,因为方向不同可能会导致跳过正确路线(迷了好久)。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 int H,w,k,X,Y,xx,yy,maxx=23333333;
 6 int q[4]={-1,0,1,0};
 7 int p[4]={0,1,0,-1};
 8 vector<int>l[3];
 9 int main(void)
10 {
11     cin>>H>>w>>k>>xx>>yy>>X>>Y;
12     xx--;yy--;X--;Y--;
13     char c[H][w];
14     int f[H][w];
15     for(int i=0;i<H;i++)
16     {
17         for(int j=0;j<w;j++)
18         {
19             cin>>c[i][j];
20             f[i][j]=maxx;
21         }
22     }
23     int h=0,r=1;
24     l[0].push_back(xx);l[1].push_back(yy);l[2].push_back(0);
25     f[xx][yy]=0;
26     while(h<r)
27     {
28         for(int i=0;i<4;i++)
29         {
30             int x1=l[0][h],y1=l[1][h];
31             for(int j=0;j<k;j++)
32             {
33                 x1+=q[i];y1+=p[i];
34                 if(x1<0||x1>=H||y1<0||y1>=w||c[x1][y1]=='@'||f[x1][y1]<l[2][h]+1)break;
35                 if(f[x1][y1]>l[2][h]+1)
36                 {
37                 f[x1][y1]=l[2][h]+1;
38                 l[0].push_back(x1);l[1].push_back(y1);l[2].push_back(l[2][h]+1);
39                 r++;
40                 }
41             }
42         }
43         h++;
44     }
45     if(f[X][Y]==maxx)cout<<"-1"<<endl;
46     else cout<<f[X][Y]<<endl;
47     return 0;
48 }

 

posted @ 2020-06-15 19:01  yanying  阅读(212)  评论(0编辑  收藏  举报