题目笔记——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;
}

浙公网安备 33010602011771号