• ABC 166


    链接:https://atcoder.jp/contests/abc166

    A:

    分析:ABC和ARC轮换。

    #include <iostream>
    #include <string>
    using namespace std;
    string s;
    int main(void)
    {
        cin>>s;
        if(s=="ABC")cout<<"ARC"<<endl;
        else cout<<"ABC"<<endl;
        return 0;
    }

    B:

    分析:找出没有snuke的snack数,直接标记遍历即可。

    #include <iostream>
    using namespace std;
    int n,k,d,ans,x,a[110];
    int main(void)
    {
        cin>>n>>k;
        for(int i=1;i<=k;i++)
        {
            cin>>d;
            while(d--)
            {
                cin>>x;
                a[x]++;
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(!a[i])ans++;
        }
        cout<<ans<<endl;
        return 0;
    }

    C:

    分析:对每个山峰与所有能通过一条路到达的山峰比较,记录输出即可。

    (这里我用了比较麻烦的方法,也可以在读入的时候一直更新每个山峰所能达到的最大值)

     1 #include <iostream>
     2 using namespace std;
     3 int n,m,cnt,ans,head[1100000],h[1100000];
     4 struct road
     5 {
     6     int to;
     7     int next;
     8 }road[1100000];
     9 void add(int u,int v)
    10 {
    11     ++cnt;
    12     road[cnt].to=v;
    13     road[cnt].next=head[u];
    14     head[u]=cnt;
    15 }
    16 int check(int t)
    17 {
    18     for(int i=head[t];i;i=road[i].next)
    19     {
    20         if(h[t]<=h[road[i].to])return 0;
    21     }
    22     return 1;
    23 }
    24 int main(void)
    25 {
    26     cin>>n>>m;
    27     for(int i=1;i<=n;i++)cin>>h[i];
    28     for(int i=1;i<=m;i++)
    29     {
    30         int u,v;
    31         cin>>u>>v;
    32         add(u,v);
    33         add(v,u);
    34     }
    35     for(int i=1;i<=n;i++)
    36     {
    37         if(check(i))
    38         {
    39             ans++;
    40         }
    41     }
    42     cout<<ans<<endl;
    43     return 0;
    44 }

    D:

    分析:可以预处理出答案在-1000~1000内,两层循环。

     1 #include <iostream>
     2 #define ll long long
     3 using namespace std;
     4 ll x;
     5 int main(void)
     6 {
     7     cin>>x;
     8     for(ll i=-1000;i<=1000;i++)
     9     {
    10         for(ll j=-1000;j<=1000;j++)
    11         {
    12             if(i*i*i*i*i-j*j*j*j*j==x)
    13             {
    14                 cout<<i<<" "<<j<<endl;
    15                 return 0;
    16             }
    17         }
    18     }
    19     return 0;
    20 }

    E:

    分析:求j-i=Ai+Aj的对数。将该式变形为i+Ai=j-Aj,然后对生成的两个数组排序遍历。注意答案用int会溢出。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int a[210000],l[210000],r[210000];
    int n;
    long long ans;
    int main(void)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            l[i]=i+a[i];
            r[i]=i-a[i];
        }
        sort(l+1,l+1+n);
        sort(r+1,r+1+n);
        int head1=1,head2=1,x=0;
        while(head1<=n)
        {
            if(l[head1]==l[head1-1])
            {
                ans+=x;
                head1++;
                continue;
            }
            else x=0;
            while(r[head2]<=l[head1]&&head2<=n)
            {
                if(r[head2]==l[head1])x++;
                head2++;
            }
            ans+=x;
            head1++;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    Linux命令——find
    Linux命令——locate
    python模块:datetime
    python模块:json
    python模块:shelve
    python模块:shutil
    python模块:sys
    python:OS模块
    str.index()与str.find()比较
    python模块:re
  • 原文地址:https://www.cnblogs.com/yanying7/p/12825903.html
Copyright © 2020-2023  润新知