A . if else 即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
int s[N];
void solve(){
bool ok=0;char a[50][50];
int n,m,r,c;cin>>n>>m>>r>>c;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='B')ok=1;
}
}
if(ok==0){
cout<<-1<<'\n';return ;
}
if(a[r][c]=='B'){
cout<<0<<'\n';return ;
}
for(int i=1;i<=n;i++)if(a[i][c]=='B'){
cout<<1<<'\n';return ;
}
for(int i=1;i<=m;i++)if(a[r][i]=='B'){
cout<<1<<'\n';return ;
}
cout<<2<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
B. 一定是四个节点 取max即可 注意输出
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define mkp make_pair
const int INF=0x3f3f3f3f;
const int N=1e5,M=1e6+10;
int mhd(int x1,int x2,int y1,int y2){
return abs(x1-x2)+abs(y1-y2);
}
void solve(){
int n,m;cin>>n>>m;int maxx=0;
int ans[n+m]={0};
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[max({mhd(1,i,1,j),mhd(n,i,m,j),mhd(1,i,m,j),mhd(n,i,1,j)})]++;
}
}
for(int i=0;i<n+m;i++){
for(int j=1;j<=ans[i];j++){
cout<<i<<" ";
}
}
cout<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
C. 质数加上质数等于质数 所以一个点最多连两个点 这样他就变成一条链 遍历走一遍链2 3 2 3 即可
注意遍历链和构建链即可
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define mkp make_pair
const int INF=0x3f3f3f3f;
const int N=1e5,M=1e6+10;
void solve(){
bool ok=0;
int n;cin>>n;
map<pair<int,int>,int> mp;
vector<int> v[n+1];
int ans[n+1];
for(int i=1;i<=n-1;i++){
int x,y;cin>>x>>y;
v[x].pb(y);v[y].pb(x);
mp[mkp(x,y)]=i;mp[mkp(y,x)]=i;
if(v[x].size()>2||v[y].size()>2)ok=1;
}
if(ok){
cout<<-1<<'\n';return ;
}
function<void(int,int,int)>dfs=[&](int now,int fa,int val){
for(auto it: v[now]){
if(it==fa)continue;
val=5-val;
ans[mp[mkp(now,it)]]=val;
dfs(it,now,val);
}
};
dfs(1,1,2);
for(int i=1;i<n;i++)cout<<ans[i]<<" ";
cout<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
D. 题意就是找到gcd 这个数组中的数的gcd 但是数组内不存在
因为是1e6所以我们暴力肯定超时 但是可以想想 我们可以暴力倍数 因为多出来的数肯定是原数组中某个数的倍数 我们就枚举倍数 因为gcd 只能小不能大 所以我们只需要递推出 是否满足每一个遍历的i 的倍数 如果最后的gcd 等于 i 那么就会cnt++;具体看代码 如果这个数i原数组出现过就跳过 如果没出现过 我们就暴力他的倍数 如果他的倍数最后gcd出它本身 就证明它可以出现在数组中就cnt++;
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
int n;cin>>n;
int ans[N+1]={0},cnt=0;int x;
for(int i=1;i<=n;i++)cin>>x,ans[x]=1;
for(int i=1;i<=N;i++){
if(ans[i]==1)continue;
long long t=0;
for(int j=i;j<=N;j+=i)if(ans[j])t=__gcd(t,j);
if(t==i)cnt++;
}
cout<<cnt<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
//int t;cin>>t;
int t=1;
while(t--){
solve();
}
}