cf 24 Game (观察+.. 想一想)
题意:
给一个数N,从1到N。
每次取两个数,三种操作:加、减、乘,运算完得一个数,把那俩数删了,把这个数加进去。
重复操作N-1次。
问是否可能得到24。若可以,输出每一步操作。
思路:
小于4,不行。
大于等于4:
偶数:1,2,3,4可以搞出24,剩下偶数个数相邻相减得1,每次与24相乘即可。
奇数:1,2,3,4,5可以搞出24,剩下偶数个数.....同理。
代码:
#include <cstdio> #include <iostream> #include <string.h> #include <cstdlib> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <map> #include <stack> using namespace std; int const uu[4] = {1,-1,0,0}; int const vv[4] = {0,0,1,-1}; typedef long long ll; int const maxn = 50005; int const inf = 0x3f3f3f3f; ll const INF = 0x7fffffffffffffffll; double eps = 1e-10; double pi = acos(-1.0); #define rep(i,s,n) for(int i=(s);i<=(n);++i) #define rep2(i,s,n) for(int i=(s);i>=(n);--i) #define mem(v,n) memset(v,(n),sizeof(v)) #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 int n; void output1(int n){ printf("1 * 2 = 2\n"); printf("2 * 3 = 6\n"); printf("6 * 4 = 24\n"); for(int i=5;i<=n-1;i+=2){ printf("%d - %d = %d\n",i+1,i,1); } rep(i,1,(n-4)/2){ printf("24 * 1 = 24\n"); } } void output2(int n){ printf("4 * 5 = 20\n"); printf("20 + 2 = 22\n"); printf("22 + 3 = 25\n"); printf("25 - 1 = 24\n"); for(int i=6;i<=n-1;i+=2){ printf("%d - %d = %d\n",i+1,i,1); } rep(i,1,(n-5)/2){ printf("24 * 1 = 24\n"); } } int main(){ scanf("%d",&n); if(n<4){ printf("NO\n"); return 0; } printf("YES\n"); if(n%2==0){ output1(n); }else{ output2(n); } }