AtCoder Beginner Contest 182 A-E

A:签到题。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <map>
 7 #include <string>
 8 using namespace std;
 9 int a,b;
10 int main(void)
11 {
12     scanf("%d %d",&a,&b);
13     printf("%d\n",2*a+100-b);
14     return 0;
15 }

 

B:输出数列中出现次数最多的大于1的因子。不是所有数的公因子,只要出现次数最多即可。那我们不妨对每个数做质因数分解,标记一下,最后找出现最多的即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <map>
 8 #include <string>
 9 using namespace std;
10 int n,x,ans=1,cnt;
11 map<int,int>mp;
12 void dic(int x)
13 {
14     for(int i=2;i*i<=x;++i)
15     {
16         if(x%i==0)
17         {
18             mp[i]++;
19             while(x%i==0)x/=i;
20         }
21     }
22     if(x!=1)mp[x]++;
23 }
24 int main(void)
25 {
26     cin>>n;
27     for(int i=1;i<=n;++i)
28     {
29         cin>>x;
30         dic(x);
31     }
32     for(auto it=mp.begin();it!=mp.end();++it)
33     {
34         if(it->second>cnt)
35         {
36             cnt=it->second;
37             ans=it->first;
38         }
39     }
40     cout<<ans<<endl;
41     return 0;
42 }

 

C:删除某些位上的数字,使得该数为3的倍数。求最小删除数量,若不可能输出-1。我们知道某个数是3的倍数,那它所有位上的数字之和应为3的倍数。先求出所有位的数字之和,再对3求余。若刚好为0,则不用删除。若为1,检查是否有1个模3余1的位或者2个模3余2的位,若有则删除这些数字。若为2,检查是否有2个模3余1的位或者1个模3余2的位,若有则删除这些数字。若删除数量正好等于数的长度,输出-1。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
using namespace std;
long long n;
int a[3],sum,cnt;
int main(void)
{
    cin>>n;
    while(n)
    {
        sum+=n%10;
        a[n%10%3]++;
        n/=10;
        cnt++;
    }
    int ans=0;
    sum%=3;
    if(sum!=0)
    {
        if(sum==1)
        {
            if(a[1]>0)ans=1;
            else if(a[2]>1)ans=2;
        }
        else
        {
            if(a[2]>0)ans=1;
            else if(a[1]>1)ans=2;
        }
    }
    if(cnt==ans)ans=-1;
    cout<<ans<<endl;
    return 0;
}

 

  

 

D:一个机器人开始在坐标为0的位置,先沿正方向走A1步,然后沿正方向走A1、A2步,一直到最后沿正方向走A1、A2、……、An步,求该过程中走到的最远坐标。求前缀和的同时维护一个最大前缀和,说明在第i次移动中当前位置加上最大前缀和就是能到达的最远距离,每次走完更新答案。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
using namespace std;
long long  n;
long long a[210000],b[210000];
int main(void)
{
    scanf("%lld",&n);
    long long m=0;
    for(int i=1;i<=n;++i)
    {
        scanf("%lld",&a[i]);
        a[i]+=a[i-1];
        m=max(m,a[i]);
        b[i]=m;
    }
    long long ans=0,now=0;
    for(int i=1;i<=n;++i)
    {
        ans=max(ans,now+b[i]);
        now+=a[i];
    }
    printf("%lld\n",ans);
    return 0;
}

 

  

 

E:有n个灯,可以向上下左右四个方向射出光线,直到遇到砖块。求所有非砖块的格子中可以被光照到(包括灯)的格子数量。我们直接对每个灯进行模拟,向四个方向遍历,直到遇到砖块或者灯就停下。(亲测遇到灯不停下会超时,虽然算了一下复杂度应该是能卡过的(口胡))

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <map>
 8 #include <string>
 9 using namespace std;
10 int l[1500][1500];
11 int a[500000],b[500000];
12 int h,w,n,m,ans;
13 int main(void)
14 {
15     scanf("%d %d %d %d",&h,&w,&n,&m);
16     ans=n;
17     for(int i=0;i<n;++i)
18     {
19         scanf("%d %d",&a[i],&b[i]);
20         --a[i];--b[i];
21         l[a[i]][b[i]]=2;
22     }
23     for(int i=0;i<m;++i)
24     {
25         int x,y;
26         scanf("%d %d",&x,&y);
27         --x;--y;
28         l[x][y]=-1;
29     }
30     for(int i=0;i<n;++i)
31     {
32         int x=a[i],y=b[i];
33         for(int j=x+1;j<h;j++)
34         {
35             if(l[j][y]==-1||l[j][y]==2)break;
36             l[j][y]=1;
37         }
38         for(int j=x-1;j>=0;j--)
39         {
40             if(l[j][y]==-1||l[j][y]==2)break;
41             l[j][y]=1;
42         }
43         for(int j=y+1;j<w;++j)
44         {
45             if(l[x][j]==-1||l[x][j]==2)break;
46             l[x][j]=1;
47         }
48         for(int j=y-1;j>=0;--j)
49         {
50             if(l[x][j]==-1||l[x][j]==2)break;
51             l[x][j]=1;
52         }
53     }
54     for(int i=0;i<h;++i)
55     {
56         for(int j=0;j<w;++j)
57         {
58             if(l[i][j]==1)ans++;
59         }
60     }
61     printf("%d\n",ans);
62     return 0;
63 }

 

 

 

F:咕咕咕

posted @ 2020-11-09 21:02  yanying  阅读(210)  评论(0编辑  收藏  举报