A
题意:
在一个坐标系下,每分钟所有人都可以移动一次,“主人公”先移动,其他人看到“主人公”移动后,会选择性的移动到相邻的格子中。问之后是否可以抓住“主人公”。
如果有人跟主人公的距离是奇数,就一定会被抓到,否则就不会,因为俩人距离相差1时,才可以被抓到,
而每移动一次,两人之间的距离就会变化,两个人都会移动的,所以只有是偶数的时候,才可以保证一定
不会被抓到
void solved()
{
int n, m, k;
cin >> n >> m >> k;
int x, y;
cin >> x >> y;
bool flag = true;
for(int i = 1; i <= k; i ++)
{
int a, b;
cin >> a >> b;
int h = abs(a - x) + abs(b - y);
if(h % 2 == 0)
flag = false;
}
if(!flag) cout << "NO" << endl;
else cout << "YES" << endl;
}
B
题意:
有n个板子,有k种不同的颜色,你每次只能选择相同的颜色,其中你只有一桶油漆,可以改变一个板子的颜色,问你,在尽可能跨数目最小的板子的情况下,跨的最大数目的板子是多少。
首先,枚举相同颜色的板子之间的距离,然后将最长的板子距离除以2(修改板子的颜色)
然后再在每种相同颜色的最长距离中选最小就ok了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
vector<int>p[N]; //二维数组p[可变化的][N]
int te[N];
void solved()
{
int n, k;
cin >> n >> k;
for(int i = 1; i <= n; i ++)
p[i].clear();
for(int i = 1; i <= n; i ++)
{
int x; cin >> x;
p[x].push_back(i); //每个颜色的位置
}
int ans = 1e9;
for(int i = 1; i <= k; i ++)
{
p[i].push_back(0);
p[i].push_back(n + 1);
sort(p[i].begin(), p[i].end()); //因为新插入了,so排序颜色位置
int cnt = 0;
for(int j = 0; j < p[i].size() - 1; j ++)
{
int now = p[i][j + 1] - p[i][j] - 1;//j计算相邻两个之间的板
te[cnt ++] = now;//存入
}
sort(te, te + cnt);
ans = min(ans, max(te[cnt - 1] / 2, te[cnt - 2]));
}
cout << ans << endl;
}
signed main()
{
int t; cin >> t;
while(t --) solved();
return 0;
}