zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",ans);
    62     return 0;
    63 }

    F:咕咕咕

  • 相关阅读:
    计算机科学中最重要的32个算法
    趣事
    深度学习迷你地图
    物理学
    代数几何
    Node.js 文件系统
    Node.js 常用工具util包
    Node.js 全局对象
    favi.icon是什么?
    Node.js 路由
  • 原文地址:https://www.cnblogs.com/yanying7/p/13950831.html
Copyright © 2011-2022 走看看