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号