AtCoder Beginner Contest 284
A
没有什么难点,反着输出一遍就可以了。
#include<bits/stdc++.h>
using namespace std;
string a[2000];
int main(){int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=n;i;i--) cout<<a[i]<<'\n';return 0;
}
B
每次判断 \(x\) 是不是奇数即可,记得清空 \(ans\)。
#include<bits/stdc++.h>
using namespace std;
int Ts,x,ans,n;
int main(){cin>>Ts;while(Ts--){cin>>n;ans=0;for(int i=1;i<=n;i++){cin>>x;if(x&1) ans++;}cout<<ans<<'\n';}return 0;
}
C
模版求联通快个数的题目,考虑从一个没有染过色的点进行扩散,将可以扩散到达的点涂成相同的颜色,最后输出颜色数量就行了。
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int n,m,idx,head[N<<1];
int vis[N],cnt;
struct Edge{int v,nxt;
}e[N<<1];
void add(int u,int v){e[++idx]={v,head[u]},head[u]=idx;
}
void dfs(int now,int last){vis[now]=cnt;for(int i=head[now];i;i=e[i].nxt){if(e[i].v!=last){if(!vis[e[i].v]){dfs(e[i].v,now);}}}
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v),add(v,u);}for(int i=1;i<=n;i++){if(!vis[i]){cnt++;dfs(i,-1);}}cout<<cnt<<'\n';return 0;
}
D
根据试除法我们可以想到枚举 \(2\) 到 \(^3\sqrt{n}\) 求解 \(q,p\),然后就直接模拟即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int Ts,n,p,q;
signed main(){cin>>Ts;while(Ts--){cin>>n;p=q=0;for(int i=2;i*i*i<=n;i++){if(n%i) continue;if((n/i)%i==0) p=i,q=n/i/i;else q=i,p=(int)round(sqrt(n/i));break;}cout<<p<<' '<<q<<'\n';}
}