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;
}
原文地址:https://www.cnblogs.com/yanying7/p/12825903.html