Codeforces传送门
洛谷传送门
题目描述
小X一直很喜欢一个纸牌游戏:“ 24 24 点”,但最近他发现这个游戏太简单了,所以他发明了一个新游戏。
你有一个整数序列,包括 n n 个整数:, 2 2 ,,…, n n 。步骤很简单,你可以从其中拿出两个数,我们假设它们是和 b b ,将这两个数从序列中删除,并将、 a−b a − b 或 a×b a × b 放入这个序列。
经过 n−1 n − 1 次操作后,序列中只会剩下一个数,你能把这个数变成是 24 24 吗?
输入输出格式
输入格式
一行,包括一个数 n n 。 输出格式
如果可以经过操作计算出,那么在第一行输出” YES Y E S ”,否则输出” NO N O ”。
在可以的前提下,接下来的 n−1 n − 1 行中,每行输出一个计算操作,形如” a op b = c a o p b = c “, a a 和表示你选择的数,而 op o p ,则是你使用的计算符号(加、减或乘)。算式中 abs(c) a b s ( c ) 不会超过(绝对值) 1018 10 18 ,请注意输出的每个算式的字符与数字之间必须有空格。
如果你有多种解决的办法,输出任意一个即可
Translated by lonelysir
输入输出样例
输入样例#1:
1
输出样例#1:
NO
输入样例#2:
8
输出样例#2:
YES
8 * 7 = 56
6 * 5 = 30
3 - 4 = -1
1 - 2 = -1
30 - -1 = 31
56 - 31 = 25
25 + -1 = 24
解题分析
看起来很高大上, 其实是一道水题。
首先, 当 n≤3 n ≤ 3 的时候是肯定不能凑出24的,当 n=4 n = 4 的时候可以有: 1×2×3×4=24 1 × 2 × 3 × 4 = 24 ,而当 n=5 n = 5 的时候有 4×5+3+2−1=24 4 × 5 + 3 + 2 − 1 = 24 。
考虑更大的情况, 发现更大的时候我们可以将多出来的数两两相减得到1,再乘上去…
所以有如下代码…
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#define R register
#define IN inline
#define gc getchar()
#define W while
void odd(R int bd)
{
printf("4 * 5 = 20\n"
"2 + 3 = 5\n"
"5 - 1 = 4\n"
"20 + 4 = 24\n");
for (R int i = 6; i < bd; i += 2)
{
printf("%d - %d = 1\n"
"24 * 1 = 24\n", i + 1, i);
}
}
void even(R int bd)
{
printf("1 * 2 = 2\n"
"2 * 3 = 6\n"
"6 * 4 = 24\n");
for (R int i = 5; i < bd; i += 2)
{
printf("%d - %d = 1\n"
"24 * 1 = 24\n", i + 1, i);
}
}
int main(void)
{
int n;
scanf("%d", &n);
if(n < 4) return printf("NO"), 0;
printf("YES\n");
if(n & 1) odd(n);
else even(n);
}