这次状态不好,总是wa题,心态都有点炸了,这里写下CDEF
传送门
主要思路: 主要是看两个相同的值的差距距离,然后计算差距距离最多的数值是多少即可
scanf("%d",&b[i]);
int x = (aa[b[i]]+(n-i)) % n;
res[x] ++;
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 200010;
int a[N], b[N];
int aa[N], bb[N];
int res[N * 2];
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
aa[a[i]] = i;
}
for (int i = 1; i <= n ; i++){
scanf("%d",&b[i]);
int x = (aa[b[i]]+(n-i)) % n;
res[x] ++;
}
int mx = 0;
for (int i = 0 ; i < n * 2; i++){
mx = max(mx,res[i]);
}
printf("%d\n",mx);
return 0;
}
主要思路: 将’B’周围都换成墙(如果旁边接‘G’,那么肯定 no,记得标记一下),然后从右下角的点dfs搜索,最终判断G的个数与原图的是否相同即可。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 200010;
string ans[55];
int idx[4] = {0,0,1,-1};
int idy[4] = {1,-1,0,0};
int k = 0;
int n,m;
int cnt = 0;
void bfs1(int x, int y){
for (int i = 0; i < 4; i ++){
int xx = x + idx[i];
int yy = y + idy[i];
if (xx >= 0 && xx < n && yy >= 0 && yy < m ){
if (ans[xx][yy] == 'G'){
k = 1;
return ;
}
else if (ans[xx][yy] == '.'){
ans[xx][yy] = '#';
}
}
}
}
void dfs(int x, int y){
for (int i = 0; i < 4; i ++){
int xx = x + idx[i];
int yy = y + idy[i];
if (xx >= 0 && xx < n && yy >= 0 && yy < m ){
if (ans[xx][yy] == 'G'){
cnt ++;
ans[xx][yy] = '#';
dfs(xx,yy);
}
else if (ans[xx][yy] == '.'){
ans[xx][yy] ='#';
dfs(xx,yy);
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
k = 0;
cnt = 0;
scanf("%d%d",&n,&m);
for (int i = 0; i < n; i++){
cin>>ans[i];
}
int num = 0;
for (int i = 0; i < n; i ++){
for (int j = 0; j < m; j++){
if (ans[i][j] == 'B'){
bfs1(i,j);
}
if (ans[i][j] == 'G'){
num ++;
}
}
}
if (ans[n-1][m-1] == '#') k =1;
dfs(n-1,m-1);
if (cnt != num){
k = 1;
}
if (num == 0) k = 0;
if (k){
puts("NO");
}
else{
puts("YES");
}
}
return 0;
}
主要思路: 可以推出一个结论,k > 3 时一定没k == 3时更优,所以我们暴力枚举,三重for循环找出最大值即可。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 510;
ll a[N];
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++){
scanf("%lld",&a[i]);
}
ll ans = 0;
for (int i = 1; i <= n; i++){
for (int j = i; j <= n; j ++){
for (int k = j; k <= n; k ++){
ans = max(ans,a[i] | a[j] | a[k]);
}
}
}
printf("%lld\n",ans);
return 0;
}
主要思路:这里我们主要是找是否能改为相对应的,这里我们发现,我们的前后的对应位置是不会改变的,但是能改变他们的位置,所以我们让他们按照pair从小到大排序就OK,然后看是否相同
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef pair <ll,ll> PII;
const int N = 550;
PII p[N],q[N];
ll a[N], b[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++){
scanf("%lld",&a[i]);
}
for (int i = 1 ; i <= n; i ++){
scanf("%lld",&b[i]);
}
for (int i = 1; i <= n / 2;i ++){
p[i] = {min(a[i],a[n - i + 1]),max(a[i],a[n - i + 1])};
q[i] = {min(b[i],b[n - i + 1]),max(b[i],b[n - i + 1])};
}
sort(p + 1, p + n / 2 + 1);
sort(q + 1, q + n / 2 + 1);
int f = 1;
if (n % 2 == 1 && a[n/2 + 1] != b[n/2 + 1]) f = 0;
for (int i = 1; i <= n / 2; i ++){
if (p[i].first != q[i].first || p[i].second != q[i].second){
f = 0;
break;
}
}
if (f) puts("YES");
else puts("NO");
}
return 0;
}