Code Forces 469C 24 Game

本文介绍了一种通过数学运算构造数字24的游戏算法。对于不同数量的初始整数,提供了不同的策略来达到目标数字24,包括直接构造和利用0进行构造的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A - A
Time Limit:1000MS    Memory Limit:262144KB    64bit IO Format:%I64d & %I64u

Description

Little X used to play a card game called "24 Game", but recently he has found it too easy. So he invented a new game.

Initially you have a sequence of n integers:1, 2, ..., n. In a single step, you can pick two of them, let's denote thema andb, erase them from the sequence, and append to the sequence eithera + b, ora - b, ora × b.

After n - 1 steps there is only one number left. Can you make this number equal to24?

Input

The first line contains a single integer n(1 ≤ n ≤ 105).

Output

If it's possible, print "YES" in the first line. Otherwise, print "NO" (without the quotes).

If there is a way to obtain 24 as the result number, in the followingn - 1 lines print the required operations an operation per line. Each operation should be in form: "aopb = c". Where a andb are the numbers you've picked at this operation;op is either "+", or "-", or "*";c is the result of corresponding operation. Note, that the absolute value ofc mustn't be greater than 1018. The result of the last operation must be equal to24. Separate operator sign and equality sign from numbers with spaces.

If there are multiple valid answers, you may print any of them.

Sample Input

Input
1
Output
NO
Input
8
Output
YES
8 * 7 = 56
6 * 5 = 30
3 - 4 = -1
1 - 2 = -1
30 - -1 = 31
56 - 31 = 25
25 + -1 = 24


这题是个找规律的题,

当n<4的时候,一定是不可能构成24的,直接输出NO

n==4的时候,

 printf("1 * 2 = 2\n");
        printf("2 * 3 = 6\n");
        printf("6 * 4 = 24\n");
n>4的时候,构造n-(n-1)=1;1*24=24即可。


#include <stdio.h>
void solve(int n)
{
    if(n%2==0)
    {
        printf("1 * 2 = 2\n");
        printf("2 * 3 = 6\n");
        printf("6 * 4 = 24\n");
        while(n>5)
        {
            printf("%d - %d = 1\n",n,n-1);
            printf("1 * 24 = 24\n");
            n-=2;
        }
    }
    else
    {
        printf("5 - 1 = 4\n");
        printf("4 - 2 = 2\n");
        printf("2 * 3 = 6\n");
        printf("6 * 4 = 24\n");
        while(n>5)
        {
            printf("%d - %d = 1\n",n,n-1);
            printf("1 * 24 = 24\n");
            n-=2;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    if(n<4)
        printf("NO\n");
    else
    {
        printf("YES\n");
        solve(n);
    }
    return 0;
}

出了构造n-(n-1)=1;

看了大牛的博客,还有一种方法是构造

  printf("0 * %d = 0\n", i);
        printf("0 + 24 = 24\n");

具体实现如下:

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n<4)
        printf("NO\n");
    else if(n==4)
    {
        printf("YES\n");
        printf("1 * 2 = 2\n");
        printf("2 * 3 = 6\n");
        printf("6 * 4 = 24\n");
    }
    else if(n==5)
    {
        printf("YES\n");
        printf("5 - 2 = 3\n");
        printf("3 + 3 = 6\n");
        printf("6 * 1 = 6\n");
        printf("6 * 4 = 24\n");
    }
    else
    {
        printf("YES\n");
        printf("6 - 5 = 1\n");
        printf("1 - 1 = 0\n");
        printf("2 * 3 = 6\n");
        printf("6 * 4 = 24\n");
        for (int i = 7; i <= n; i++)
            printf("0 * %d = 0\n", i);
        printf("0 + 24 = 24\n");
    }
    return 0;
}

不过时间上,貌似构造n-(n-1)更快一点(31ms),0的构造是46ms.以此为鉴。

### Codeforces Problem 1130C 解析 用户提到的是 **Codeforces Problem 742B** 的相关内容,而问题是希望找到关于 **Problem 1130C** 的解答或解释。以下是针对 **Problem 1130C** 的解析。 #### 题目概述 在 **Codeforces Problem 1130C (Array Beauty)** 中,给定一个数组 `a` 和整数 `k`,定义子序列的美丽值为该子序列中的最小差值。目标是从数组中选取长度至少为 `k` 的子序列,使得其美丽值最大化,并返回这个最大化的美丽值。 --- #### 关键概念与算法思路 为了求解此问题,可以采用二分法结合滑动窗口技术来高效解决问题: 1. **二分搜索范围**: 子序列的美丽值可能的最大值是数组中相邻两个元素之间的最小差值,因此可以通过二分搜索的方式,在 `[0, max_diff]` 范围内寻找满足条件的最大美丽值[^5]。 2. **验证函数设计**: 对于每一个候选美丽值 `mid`,通过滑动窗口检查是否存在一个子序列,其中任意两元素之差均不大于 `mid` 并且长度不小于 `k`。如果存在,则说明当前美丽值可行;否则不可行[^6]。 3. **实现细节**: - 使用双指针维护滑动窗口。 - 记录窗口内的元素数量以及它们之间是否满足美丽值约束。 --- #### 实现代码 以下是一个基于 Python 的解决方案: ```python def can_form_subsequence(a, k, mid): count = 0 last = float('-inf') for num in a: if num >= last + mid: count += 1 last = num if count >= k: return True return False def array_beauty(n, k, a): low, high = 0, max(a) - min(a) result = 0 while low <= high: mid = (low + high) // 2 if can_form_subsequence(sorted(a), k, mid): result = mid low = mid + 1 else: high = mid - 1 return result # 输入处理 n, k = map(int, input().split()) a = list(map(int, input().split())) print(array_beauty(n, k, a)) ``` 上述代码实现了二分查找逻辑并配合辅助函数完成验证操作[^7]。 --- #### 测试样例分析 对于输入数据: ``` Input: 5 3 1 3 2 4 5 Output: 2 ``` 程序会按照如下流程执行: - 排序后的数组为 `[1, 2, 3, 4, 5]`。 - 初始二分区间为 `[0, 4]`。 - 经过多次迭代最终得出结果为 `2`,即最长符合条件的子序列美丽值。 --- #### 时间复杂度与空间复杂度 - **时间复杂度**: O(N log M),其中 N 是数组大小,M 是数组中最大值减去最小值的结果。 - **空间复杂度**: O(1),除了存储原始数组外无需额外的空间开销[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值