C. Fill in the Matrix Codeforces Round 896 (Div. 2)

Problem - C - Codeforces

题目大意:给出两个数n,m,要求构造一个n*m的矩阵,满足每一行都是一个m的排列,且每一列的MEX构成数组s,要求MEX(s)最大

1<=n,m<=2e5;n*m<=2e5

思路:因为要让每一列的MEX的MEX最大,那么我们每一列从左往右的MEX应该是0,1,2,3...这样的,所以构造方案应该如下形式:

1,2,3...m,0

2,3,4...0,1

3,4,5...1,2

...

这样的构造MEX肯定是最大的,接下来考虑MEX具体是多少,可以发现当m固定时,随着n的增大,MEX也在增大,知道n=m-1后,MEX不变,等于m,在n

#include
//#include<__msvc_all_public_headers.hpp>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
ll a[N];
void init()
{

}
void solve()
{
	ll m;
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		a[i] = i - 1;
	}
	if (m == 1)
	{//因为下面要%m-1,所以要特判除数为0的情况
		cout << 0 << endl;
		for (int i = 1; i <= n; i++)
		{
			cout << 0 << endl;
		}
		return;
	}
	if (n >= m - 1)
	{
		cout << m << endl;
	}
	else
	{
		cout << n + 1 << endl;
	}
	for (int i = 1; i <= n; i++)
	{
		int l = i % (m - 1);//行构造一共m-1种,循环取
		if (l == 0)
		{
			l = m;
		}
		else
		{
			l++;
		}
		for (int j = l; j <= m; j++)
		{
			cout << a[j] << " ";
		}
		for (int j = 1; j < l; j++)
		{
			cout << a[j] << " ";
		}
		cout << endl;
	}
}
int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

你可能感兴趣的:(贪心,算法,c++,数据结构)