CF468A | 24 Game 找规律+打表
(翻译版本来自 Luogu by lonelysir )
题目描述
小X一直很喜欢一个纸牌游戏:“24点”,但最近他发现这个游戏太简单了,所以他发明了一个新游戏。
你有一个整数序列,包括n个整数:1,2,3,...,n。步骤很简单,你可以从其中拿出两个数,我们假设它们是a和b,将这两个数从序列中删除,并将a+b、a-b或a×b放入这个序列。
经过n−1次操作后,序列中只会剩下一个数,你能把这个数变成是24吗?
输入格式
一行,包括一个数n。 输出格式
如果可以经过操作计算出24,那么在第一行输出"YES",否则输出"NO"。
在可以的前提下,接下来的 \(n−1\) 行中,每行输出一个计算操作,形如 \("a~~op~~b~~=~~c"\),a和b表示你选择的数,而\(~op~\),则是你使用的计算符号(加、减或乘)。算式中 \(abs(c)\) 不会超过 \(|10^8|\)
输出格式
请注意输出的每个算式的字符与数字之间必须有空格。
如果你有多种解决的办法,输出任意一个即可
输入输出样例
输入 #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
——————————————————————————————————————————
想着练习一下暴搜搜到的题目,没想到是个规律题233
如果枚举每一种情况的话复杂度就上天了,于是我们开始挖掘题目的特殊性质。
注意到给出的\(~N~\)个整数,分别是\(~1、2、3……N~\)
而每连续的四个整数往往可以仅通过加减法组成\(~\),
例如,有四个连续整数:\(~8,9,10,11~\)
\(~10~+~9~-~8~-~11~=~0~\)
于是只要从数列的末尾开始四个四个地消除(\(0\)对答案没有贡献),直到剩余 \(4~-~7\) 个数
通过人脑的运算我们可以打表出\(N=4、5、6、7\)时的答案,然后汇总按照题目规范输出即可
PS:当\(~N=1、2、3~\)时无解,输出"\(~NO~\)"
辛苦写SPJ的人了
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
	scanf("%d",&n);
	if (n==1 || n==2 || n==3) { printf("NO"); return 0; }
	printf("YES\n");
	while (n>=8) {
		//n n-1 n-2 n-3
		printf("%d - %d = 1\n",n,n-1);
		printf("%d - %d = -1\n",n-3,n-2);
		printf("1 + -1 = 0\n");
		printf("%d + 0 = %d\n",n-4,n-4);
		n-=4;
	}
	if (n==4) {
		printf("1 * 2 = 2\n");
		printf("2 * 3 = 6\n");
		printf("4 * 6 = 24");
	}
	else if (n==5) {
		printf("3 + 4 = 7\n");
		printf("7 + 5 = 12\n");
		printf("12 * 2 = 24\n");
		printf("24 * 1 = 24");
	}
	else if (n==6) {
		printf("6 - 3 = 3\n");
		printf("3 + 4 = 7\n");
		printf("7 + 5 = 12\n");
		printf("12 * 2 = 24\n");
		printf("24 * 1 = 24");
	}
	else if (n==7) {
		printf("7 - 6 = 1\n");
		printf("3 + 4 = 7\n");
		printf("7 + 5 = 12\n");
		printf("12 * 2 = 24\n");
		printf("24 * 1 = 24\n");
		printf("24 * 1 = 24");
	}	
	return 0;
}
其实好像分奇偶性讨论会更简单

 
                
             
         浙公网安备 33010602011771号
浙公网安备 33010602011771号