这套题简单得匪夷所思。。def都是分析下性质就出来了。。
d:把B周围四个点标记一下,然后跑一次联通块就行
#include<bits/stdc++.h> using namespace std; #define N 55 int X,Y,n,m,f[N][N],v[N][N]; char mp[N][N]; void dfs(int x,int y){ if(v[x][y] || f[x][y] || x==0 || y==0 || x==n+1 || y==m+1)return; v[x][y]=1; dfs(x+1,y); dfs(x-1,y); dfs(x,y-1); dfs(x,y+1); } int main(){ int t;cin>>t; while(t--){ cin>>n>>m; memset(f,0,sizeof f); memset(v,0,sizeof v); for(int i=1;i<=n;i++)scanf("%s",mp[i]+1); int cnt=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(mp[i][j]=='B') f[i][j]=f[i-1][j]=f[i+1][j]=f[i][j-1]=f[i][j+1]=1; if(mp[i][j]=='#')f[i][j]=1; if(mp[i][j]=='G')cnt++; } X=n,Y=m; if(f[X][Y]){ if(cnt)puts("NO"); else puts("YES"); continue; } dfs(X,Y); int flag=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(mp[i][j]=='G' && v[i][j]==0)flag=1; if(!flag)puts("YES"); else puts("NO"); } }
E:k最大=3
#include<bits/stdc++.h> using namespace std; #define N 505 #define ll long long ll n,a[N]; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; ll ans=0; for(int i=1;i<=n;i++)ans=max(ans,a[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) ans=max(ans,a[i]|a[j]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++) ans=max(ans,a[i]|a[j]|a[k]); cout<<ans<<' '; }
F:每次操作只能同时修改a[i]和a[n-i+1]的位置,看a[]和b[]里对应的数对是不是一样的即可
#include<bits/stdc++.h> using namespace std; #define N 505 map<int,multiset<int> >mp1,mp2; int n,a[N],b[N]; int main(){ int t;cin>>t; while(t--){ scanf("%d",&n); mp1.clear();mp2.clear(); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&b[i]); for(int i=1;i<=n;i++){ mp1[a[i]].insert(a[n-i+1]); mp2[b[i]].insert(b[n-i+1]); } int f=0; for(auto p:mp1){ int x=p.first; auto s=p.second; if(mp2[x]!=s)f=1; } if(f)cout<<"No"<<' '; else cout<<"Yes"<<' '; } }