AtCoder Beginner Contest 166
Posted yanying7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 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; }
以上是关于AtCoder Beginner Contest 166的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 115 题解