Codeforces Global Round 17

A. Anti Light's Cell Guessing

A卡了很久,笑死根本看不懂题意
传送门
题意:
使用尽可能少的坐标,使用曼哈顿距离((a1-a2)+(b1-b2))去确定其他所有点,输出最少已知坐标的方案k
题解:
如果只有(1,1),那么k=0,若是(1,x)或(x,1)我们假设已知点是(1,1),根据曼哈顿公式能确定其他所有点坐标,其他情况,升级为二维坐标,我们假设已知点是(1,1)和(n,1),也就是左上角和左下角,就可以通过曼哈顿距离推算出其他点的距离。
比如,我们求(i,j),对于(1,1) 曼哈顿距离b1 = i- 1 + j - 1, 对于(n,1) , b2 = n - i + j - 1, b1 + b2 求出j,因此未知点坐标可以求出来,所以ans 只有 0,1,2三种情况
code:

#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
int st[1000];
 
int main()
{
    int T;
    cin >> T;
    while(T -- ){
    	int n, m;
    	cin >> n >> m;
    	int ans;
    	if (n == 1 && m == 1) ans = 0;
		else if (n == 1 || m == 1) ans = 1;
		else ans = 2;
		cout << ans << endl;
	}
		return 0;
}

B. Kalindrome Array

传送门
题意:
让我们删除某一个数字n次(n >= 0)能否让这个数组为回文
题解:
我们分别采用双指针指向数组初始下标1和末尾下标n,直到遇到两个数字不相等的情况,记录下来两个数数字s1,s2,并break,之后再分别将s1和s2全部删除,判断是否为回文
code:

#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int st[N];
int a[N];

int main(){
	int t;
	cin >> t;
	while (t --){
		int n;
		cin >> n;
		
		for (int i = 1; i <= n; i ++)
			cin >> a[i];
		
		int l = 1, r = n;
		int x, y;
		int flag = 0;
		
		while (l <= r){
			if(a[l] != a[r]){
				flag = 1;
				x = a[l];
				y = a[r];
				break;
			}
			l ++, r --;
		}
		
		if (!flag){
			cout << "YES" << endl;
			continue;
		}
		
		flag = 0;
		l = 1, r = n;
		while(l <= r){
			if(a[l] == x){
				l ++;
				continue;
			}
			if(a[r] == x){
				r --;
				continue;
			}
			if(a[r] != a[l]){
				flag ++;
				break;
			}
			l ++, r --;
		}
		
		if (!flag){
			cout << "YES" << endl;
			continue;
		}		
		
		l = 1, r = n;
		while(l <= r){
			if(a[l] == y){
				l ++;
				continue;
			}
			if(a[r] == y){
				r --;
				continue;
			}
			if(a[r] != a[l]){
				flag ++;
				break;
			}
			l ++, r --;
		}
		if(flag == 1) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}
posted @ 2021-11-25 16:32  Gsding  阅读(33)  评论(0)    收藏  举报