[Codeforces Round #268 (Div. 1) -A] 24 Game

32 篇文章 0 订阅
4 篇文章 0 订阅
Codeforces传送门
洛谷传送门

题目描述

小X一直很喜欢一个纸牌游戏:“ 24 24 点”,但最近他发现这个游戏太简单了,所以他发明了一个新游戏。

你有一个整数序列,包括 n n 个整数:1 2 2 3,…, n n 。步骤很简单,你可以从其中拿出两个数,我们假设它们是a b b ,将这两个数从序列中删除,并将a+b ab a − b a×b a × b 放入这个序列。

经过 n1 n − 1 次操作后,序列中只会剩下一个数,你能把这个数变成是 24 24 吗?

输入输出格式

输入格式

一行,包括一个数 n n 。 输出格式

如果可以经过操作计算出24,那么在第一行输出” YES Y E S ”,否则输出” NO N O ”。

在可以的前提下,接下来的 n1 n − 1 行中,每行输出一个计算操作,形如” a op b = c a   o p   b   =   c “, a a b表示你选择的数,而 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

解题分析

看起来很高大上, 其实是一道水题。

首先, 当 n3 n ≤ 3 的时候是肯定不能凑出24的,当 n=4 n = 4 的时候可以有: 1×2×3×4=24 1 × 2 × 3 × 4 = 24 ,而当 n=5 n = 5 的时候有 4×5+3+21=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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值