题目笔记——P12549 [UOI 2025] Gift for Anton

好题。

迷惑点

很容易看出,虽然题目中说了有 \(5\) 种数字,但 \(3\),\(4\) 都是不可行的。因为每个 "3" 和 "4" 的旁边都至少有 \(3\) 个与它相等的数,所以会导致整个矩形表格都为 "3" 或 "4"。但是矩形表格的四个角上的 "3" 和 "4" 的旁边只有 \(2\) 个数,所以结果不可能有 "3" 或 "4"。

部分分

当 \(n=1\) 时

当 \(m=1\) 时,输出 0。
当 \(m=2\) 时,输出 1 1。
当 \(m>2\) 时,可以通过 0 和 1 1 进行组合。具体思考过程如下:

  • 当 \(m \equiv 0 \pmod 3\) 时,则输出 \(\lfloor\frac{m}{3}\rfloor\) 个 1 1 0。
  • 当 \(m \equiv 1 \pmod 3\) 时,则先输出一个 0,再输出 \(\lfloor\frac{m}{3}\rfloor\) 个 1 1 0。
  • 当 \(m \equiv 2 \pmod 3\) 时,则先输出 \(\lfloor\frac{m}{3}\rfloor\) 个 1 1 0,再输出一个 1 1。

当 \(n=2\) 时(理论一致,会的可以直接看下一部分了。)

当 \(m=1\) 时,输出为:

1
1

当 \(m=2\) 时,输出为:

2 2
2 2

当 \(m>2\) 时,可以通过 1 和 2 2 进行组合。具体思考过程如下:

  • 当 \(m \equiv 0 \pmod 3\) 时,则输出 \(\lfloor\frac{m}{3}\rfloor\) 个 2 2 1。
  • 当 \(m \equiv 1 \pmod 3\) 时,则先输出一个 1,再输出 \(\lfloor\frac{m}{3}\rfloor\) 个 2 2 1。
  • 当 \(m \equiv 2 \pmod 3\) 时,则先输出 \(\lfloor\frac{m}{3}\rfloor\) 个 2 2 1,再输出一个 2 2 1。

记得输出两遍。

警示后人!

前后特别判断的地方的前或后要加空格!

部分分转化成AC

不难发现,\(n=1\) 时和 \(n=2\) 时的数刚好错开,这就说明了 \(n=1\) 时和 \(n=2\) 可以组合,可以定义两个函数来存,如 \(ans1\),\(ans2\):

  • 当 \(n \equiv 0 \pmod 3\) 时,则输出 \(\lfloor\frac{n}{3}\rfloor\) 个 \(ans2\),\(ans1\)。
  • 当 \(n \equiv 1 \pmod 3\) 时,则先输出一个 \(ans1\),再输出 \(\lfloor\frac{n}{3}\rfloor\) 个 \(ans2\),\(ans1\)。
  • 当 \(n \equiv 2 \pmod 3\) 时,则先输出 \(\lfloor\frac{n}{3}\rfloor\) 个 \(ans2\),\(ans1\),再输出一个 \(ans2\)。

警示后人!

前后特别判断的地方的前或后要加回车!

本蒟蒻的第二篇题解,大佬勿喷。

Code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;

void ans1(){
	if(m % 3 == 1) cout << "0 ";
	for(int i = 1; i <= m / 3; i++){
		cout << "1 1 0 ";
	}
	if(m % 3 == 2){
		cout << "1 1";
	}
	cout << endl;
}

void ans2(){
	if(m % 3 == 1) cout << "1 ";
	for(int i = 1; i <= m / 3; i++){
		cout << "2 2 1 ";
	}
	if(m % 3 == 2){
		cout << "2 2";
	}
	cout << endl;
	if(m % 3 == 1) cout << "1 ";
	for(int i = 1; i <= m / 3; i++){
		cout << "2 2 1 ";
	}
	if(m % 3 == 2){
		cout << "2 2";
	}
	cout << endl;
}
 
signed main(){
	cin >> n >> m;
	if(n % 3 == 1){
		ans1();
	}
	for(int i = 1; i <= n / 3; i++){
		ans2();
		ans1();
	}
	if(n % 3 == 2){
		ans2();
	}
	return 0;
}

AC 记录。

posted @ 2026-10-27 16:25  show__code  阅读(2)  评论(0)    收藏  举报