Codeforces Round 1002 (Div. 2)
A - Milya and Two Arrays
题意
给定\(2\)葛长度为\(n\)的数组\(a,b\),这\(2\)个数组中的每个元素至少出现了\(2\)次。将两个数组重新组成一个长度为\(n\)的数组\(c\),其中\(c_i=a_i+b_i\)。问能否通过重新排列\(a,b\)使得\(c\)中至少有\(3\)葛不同的元素
思路
由于\(n\ge 3\),只需统计\(a,b\)数组中不同元素的数量,只有一个\(1\)和一个\(<3\)的时候无解
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 5e5 + 5;
void solve()
{
int n;
cin >> n;
set<int> a, b;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
a.insert(x);
}
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
b.insert(x);
}
if (a.size() == 1 && b.size() < 3 || b.size() == 1 && a.size() < 3)
{
cout << "No" << endl;
return;
}
cout << "Yes" << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Cost of the Array
题意
给定长度为\(n\)的整数数组\(a\)和偶整数\(k\)。将\(a\)恰好划分为\(k\)个子数组,再把偶数索引的子数组串联成一个数组\(b\),并在最后加上一个\(0\),其中\(b\)的花费为\(b_i \neq i\)的最小索引\(i\)。求\(b\)的最小花费
思路
当\(n=k\)时答案是唯一的,直接算;其他情况为使花费最小,要尽量让\(b_1 \neq 1\),这样的花费是\(1\),对于不能满足\(b_1\neq 1\)的情况,证明\(a\)的前几个元素(除了第一个)一定全是\(1\),一定可以满足\(b_2\neq 2\),因此答案只有\(1,2\)
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 5e5 + 5;
void solve()
{
int n, k;
cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
if (k == n)
{
int cnt = 1;
for (int i = 2; i <= n; i += 2)
{
if (a[i] != cnt++)
{
cout << cnt - 1 << endl;
return;
}
}
cout << cnt << endl;
return;
}
for (int i = 2; i <= n - k + 2; i++)
{
if (a[i] != 1)
{
cout << 1 << endl;
return;
}
}
cout << 2 << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Customer Service
题意
给定整数\(n\),即有\(n\)个队列;给定\(n×n\)的二维数组\(a\),其中\(a_{i,j}\)表示第\(i\)葛队列在时间\(j\)来\(a_{i,j}\)个人。每个时刻除了"来人"的操作,还须选择一个队列进行一次清空(将人数变为\(0\))。最后第\(i\)个队列的人数为\(x_i\)。求\(MEX(x_1,x_2,···,x_n)\)的最大值
思路
最后一次清空保证有一个\(0\);其他只需维护连续是\(1\)的后缀,如果最大后缀是\(m\),就能保证该个队列最后人数能在\([0,m]\)之间
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 5e5 + 5;
void solve()
{
int n;
cin >> n;
vector<int> suf(n + 1);
vector<vector<int>> a(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
for (int j = n; j >= 1; j--)
{
if (a[i][j] != 1)
{
break;
}
suf[i]++;
}
}
multiset<int> s;
for (int i = 1; i <= n; i++)
{
s.insert(suf[i]);
}
int ans = 1;
for (auto& i : s)
{
if (i >= ans)
{
ans++;
}
}
cout << min(ans, n) << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
D -
题意
思路
代码
点击查看代码

浙公网安备 33010602011771号