题解:UVA12172 Matchsticks
UVA12172 Matchsticks 题解
题目传送门
这一道题跟 CSP-J2024 的第三道题其实是一摸一样的(有一点小区别),当时考场上面卡了半天,只拿了 60 分,回来分析了一下,考试的原本的题发不了题解了跑这里来刷一下存在感
正片开始
1.分析最小值应该怎么办
确定大概方向
首先,只要上过小学都知道,一个数想要判断它的大小,首先先比他的位数,然后再逐位比较,那么基础思路就可以出来了,经过对比可以发现, 8 这个数是花费火柴棍最多的,所以整个由火柴棍拼出来的数应该主要是 8
如何让 8 占的最多呢?
可以发现如果 \(n\bmod7=0\) 直接输出 \(n\div7\) 个 8 就行了
如果 \(n\bmod7=1\) 呢?可以发现,一个火柴棍拼不出任何东西,所以可以再借一个 7 出来,由八个火柴棍拼出 10
然后只需要继续判断 \(n\bmod7 = 2\) 、\(n\bmod7=3\) 、 \(n\bmod7=4\) 、 \(n\bmod7=5\) 、 $n\bmod 7= 6 $ 以此类推
//此部分代码
if (n == 1)cout << -1;
else if (n == 2)cout << 1;
else if (n == 3)cout << 7;
else if (n == 4)cout << 4;
else if (n == 5)cout << 2; //特判,只能拼一个的情况
else if (n == 6)cout << 6;
else if (n == 7)cout << 8;
else if (n % 7 == 0)for (int i = 1; i <= n / 7; i++)cout << 8;
else if (n % 7 == 1) {
cout << 10;
for (int i = 1; i <= (n - 8) / 7; i++)cout << 8;
} else if (n % 7 == 2) {
cout << 1;
for (int i = 1; i <= (n - 2) / 7; i++)cout << 8;
} else if (n % 7 == 3) {
if (n == 10)cout << 22;
else {
cout << 200;
for (int i = 1; i <= (n - 17) / 7; i++)cout << 8;
}
} else if (n % 7 == 4) {
cout << 20;
for (int i = 1; i <= (n - 11) / 7; i++)cout << 8;
} else if (n % 7 == 5) {
cout << 2;
for (int i = 1; i <= (n - 5) / 7; i++)cout << 8;
} else if (n % 7 == 6) {
cout << 6;
for (int i = 1; i <= (n - 6) / 7; i++)cout << 8;
}
很好,恭喜你已经完成了一半了!!!加油
2 .那么最大值该怎么办呢??
确定方向
根据上一个问题求最小值可以反推,使用的火柴棍个数最少的数字应该着重使用,所以 1 就很荣幸地入选了,因为他就只用 2 根
如何让 1 占比更多呢?
特判,只要 \(n\bmod2=0\) ,那么就重复输出 \(n \div 2\) 个 1 就行了
否则,看一下,没有用 1 根火柴棍的,那么多拆出来一个 2 ,用三个火柴棍拼出来一个 7 ,之后重复输出 \(( n - 3 ) \div 2\) 个 1 就行了
此部分代码展示
if (n % 2 == 0) { //第一种情况
cout << " ";
for (int i = 1; i <= n / 2; i++) {
cout << 1;
}
cout << '\n';
} else { //第二种情况
cout << " ";
cout << 7;
for (int i = 1; i < n / 2; i++) {
cout << 1;
}
cout << '\n';
}
接下来附上 AC 代码
#include<bits/stdc++.h>
using namespace std;
long long n, t, ans, stick[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
void nummax() {
if (n % 2 == 0) {
cout << " ";
for (int i = 1; i <= n / 2; i++) {
cout << 1;
}
cout << '\n';
} else {
cout << " ";
cout << 7;
for (int i = 1; i < n / 2; i++) {
cout << 1;
}
cout << '\n';
}
}
int main() {
cin >> t;
while (t--) {
cin >> n;
ans = 1e9+1;
if (n == 1)cout << -1;
else if (n == 2)cout << 1;
else if (n == 3)cout << 7;
else if (n == 4)cout << 4;
else if (n == 5)cout << 2;
else if (n == 6)cout << 6;
else if (n == 7)cout << 8;
else if (n % 7 == 0)for (int i = 1; i <= n / 7; i++)cout << 8;
else if (n % 7 == 1) {
cout << 10;
for (int i = 1; i <= (n - 8) / 7; i++)cout << 8;
} else if (n % 7 == 2) {
cout << 1;
for (int i = 1; i <= (n - 2) / 7; i++)cout << 8;
} else if (n % 7 == 3) {
if (n == 10)cout << 22;
else {
cout << 200;
for (int i = 1; i <= (n - 17) / 7; i++)cout << 8;
}
} else if (n % 7 == 4) {
cout << 20;
for (int i = 1; i <= (n - 11) / 7; i++)cout << 8;
} else if (n % 7 == 5) {
cout << 2;
for (int i = 1; i <= (n - 5) / 7; i++)cout << 8;
} else if (n % 7 == 6) {
cout << 6;
for (int i = 1; i <= (n - 6) / 7; i++)cout << 8;
}
nummax();
}
return 0;
}
本蒟蒻的第一篇题解,求通过

浙公网安备 33010602011771号