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;
}

浙公网安备 33010602011771号