「杂题乱刷」CF468A

发布时间 2023-11-23 20:36:48作者: wangmarui

原题链接

CF468A 24 Game

题目简述

现在有一个序列 \(n\) 包含 \(n\) 个整数 \(1 \sim n\),如果我们能经过加减乘三种操作让这个序列只剩下 \(24\),如果可以,输出 YES 并给出构造方案,否则输出 NO

解题思路

首先不难看出,如果 \(n\) 小于 \(4\) 的话,那么是一定不能构造出方案的,因为无论你怎么操作,结果都不可能大于 \(24\),但是当 \(n\) 大于等于 \(4\) 的时候,那么是一定能构造出方案的,证明如下:

  1. 如果 \(n\) 为奇数,那么只需要用 \(1 \sim 5\) 凑出 \(24\),然后再把剩下没操作过的相邻的数依次相减,再与 \(24\) 相乘即可;
  2. 如果 \(n\) 为偶数,那么只需要用 \(1 \sim 4\) 凑出 \(24\),然后再把剩下没操作过的相邻的数依次相减,再与 \(24\) 相乘即可。

以下是 \(1 \sim 4\)\(1 \sim 5\)\(24\) 点的方法:

\(1 \sim 4\)

1*2=2 2*3=6 6*4=24

\(1 \sim 5\)

2*4=8 3*5=15 15+8=23 23+1=24

参考代码

#include<bits/stdc++.h>
using namespace std;
#define QwQ return 0;
long long n;
int main()
{
	cin>>n;
	if(n<=3)//如果n小于4
	{
		cout<<"NO";//直接输出NO
		return 0;
	}
	else//如果n大于等于4
	{
		cout<<"YES"<<endl;//输出YES
		if(n%2)//如果n为奇数
		{
			cout<<"2 * 4 = 8"<<endl<<"3 * 5 = 15"<<endl<<"15 + 8 = 23"<<endl<<"23 + 1 = 24"<<endl;
			for(int i=n;i>5;i-=2)//将剩下的数依次相减
				cout<<i<<" - "<<i-1<<" = "<<"1"<<endl<<"24 * 1 = 24"<<endl;			
		}
		else//如果n为偶数
		{
			cout<<"1 * 2 = 2"<<endl<<"2 * 3 = 6"<<endl<<"4 * 6 = 24"<<endl;
			for(int i=n;i>4;i-=2)//将剩下的数依次相减
				cout<<i<<" - "<<i-1<<" = "<<"1"<<endl<<"24 * 1 = 24"<<endl;
		}
	}
	QwQ;
}