原题链接
题目简述
现在有一个序列 \(n\) 包含 \(n\) 个整数 \(1 \sim n\),如果我们能经过加减乘三种操作让这个序列只剩下 \(24\),如果可以,输出 YES
并给出构造方案,否则输出 NO
。
解题思路
首先不难看出,如果 \(n\) 小于 \(4\) 的话,那么是一定不能构造出方案的,因为无论你怎么操作,结果都不可能大于 \(24\),但是当 \(n\) 大于等于 \(4\) 的时候,那么是一定能构造出方案的,证明如下:
- 如果 \(n\) 为奇数,那么只需要用 \(1 \sim 5\) 凑出 \(24\),然后再把剩下没操作过的相邻的数依次相减,再与 \(24\) 相乘即可;
- 如果 \(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;
}
标签:24,相减,CF468A,剩下,依次,杂题,sim
From: https://www.cnblogs.com/wangmarui/p/17852445.html