Dashboard - Codeforces Round 888 (Div. 3) - Codeforces
A. Escalator Conversations
有n个人,m级台阶,每级台阶的高度为k,主人公的身高为H。
问主人公最多能与几个人站在同等高度聊天(主人公不能与其他人站在同一台阶)
记录主人公和每个人的高度差x(不能为0)
若m = 5, k = 3,台阶的高度为i * k,最高为 (m - 1)* k, x / k 必须小于m,并且必须x必须是k的倍数
void sovle()
{
ll n, m, k, h, i, t;
cin >> n >> m >> k >> h;
ll cnt = 0;
for(i = 0; i < n; i ++)
{
cin >> t;
ll x = abs(h - t);
if(x / k < m && x % k == 0 && x != 0)
cnt ++;
}
cout << cnt << endl;
}
B. Parity Sort
有一个长度为n的数组a,每次交换两个数必须都是偶数或者奇数,是否能变成非递减数组。
用f数组标记奇数偶数
对a数组排序,判断a数组和f数组奇数偶数是否一致
void sovle()
{
ll n, m, k, h, i, t;
cin >> n;
for(i = 0; i < n; i ++)
{
cin >> a[i];
f[i] = a[i] % 2;
}
sort(a, a + n);
for(i = 0; i < n; i ++)
if(f[i] != a[i] % 2)
break;
if(i == n)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
bool judge()
{
for(int i = 1; i <= n; i++)
if((a[i] & 1) != (b[i] & 1))
return 0;
return 1;
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]), b[i] = a[i];
sort(a + 1, a + n + 1);
if(judge())
puts("YES");
else
puts("NO");
}
return 0;
}
C. Tiles Comeback
有n个格子和一个整数k,第i个格子被染上一个颜色ci,问是否能够找到一条从格子1到格子n的路径,使得:
1、p(路径的总长)能够被k整除
2、路径能分成长度为k的块
3、每个块中的颜色相同,而块与块之间的颜色不同
只需要考虑首尾相同颜色(a[0]==a[n - 1])和首尾颜色不相同(a[0] != a[n - 1])两种情况
首颜色a[0]数量必须要>=k,如果数量为k就break
继续往后找尾颜色a[n - 1]数量,也是必须要>=k,,如果数量为k就break
必须要保证i继续往后走---例如 1 2 1 2 1 2 1 2,无法从1走到n
void sovle()
{
ll n, k, i, flag = 0, cnt1 = 0, cnt2 = 0;
cin >> n >> k;
for(i = 0; i < n; i ++)
cin >> a[i];
for(i = 0; i < n; i ++)
{
if(a[i] == a[0])
cnt1 ++;
if(cnt1 == k)
break;
}
for(; i < n; i ++)
{
if(a[i] == a[n - 1])
cnt2 ++;
if(cnt2 == k)
break;
}
if(a[0] == a[n - 1] && cnt1 == k)
flag = 1;
if(a[0] != a[n - 1] && cnt1 == k && cnt2 == k)
flag = 1;
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
D. Prefix Permutation Sums
给你一个前缀和数组,但是里面会少一个数,能否找到满足条件的原数组、
原数组的每个数都在[1,n]中
先求差分,判断t是否在[1,n]中,如果符合就标记1
如果t是重复出现或者超出n就另开一个数组存起来(存起来的数超过2个就输出no)
缺少的这个数,是原数组有2个数没有加上去
差分出来的数不在范围内的只有一个,判断一下没出现过的数字之和加起来是否就是那个不在范围内的数字。
void sovle()
{
ll i, n;
cin >> n;
vector<ll> f(n + 1), v;
for(i = 1; i < n; i ++)
cin >> a[i];
for(i = 1; i < n; i ++)
{
ll t = a[i] - a[i - 1];
if(t >= 1 && t <= n && !f[t])
f[t] = 1;
else
v.push_back(t);
}
if(v.size() == 0)
cout << "YES" << endl;
else if(v.size() == 1)
{
ll sum = 0;
for(i = 1; i <= n; i ++)
if(!f[i])
sum += i;
if(sum == v.front())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else
cout << "NO" << endl;
}