题解: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;
}

本蒟蒻的第一篇题解,求通过

posted @ 2025-07-28 10:10  ppi_SAMA  阅读(11)  评论(0)    收藏  举报