zoukankan      html  css  js  c++  java
  • codeforces 468A. 24 Game 解题报告

    题目链接:http://codeforces.com/problemset/problem/468/A

    题目意思:给出一个数n,利用 1 ~ n 这 n 个数,每个数只能用一次,能否通过3种运算: +、-、* 使得最后的结果为24。

          首先大方向想得是对的,就是用前面尽量连续的数构成24,而后面就通过相互抵消变成0,这样就不会影响到前面算出的结果。

          但有两个地方比较致命,所以最终要看着test的数据改~~。首先没有留意到 n 个数操作的次数恰好为 n - 1 次!!(之前千辛万苦找到构成24的方法由于遗漏这个条件,几乎付诸东流啊~~)。其次,抵消方式不正确。我的抵消方式是通过 +1, -1,..., 相加来变成0的。这样意味着,除去前面那些能构成24的数(假设以k结尾),次数为k-1次,后面n-k个数,即 k+1, k+2,...,n,要 操作 n - k 次,但我这样的抵消方式操作的次数是得不出n-k的,而且还有个比较苛刻的条件,后面这n-k个数构成的对数一定要为偶数对(每对为两个),这样通过两两配对,次数就是(n-k)/4 * 3 (4表示每组看成连续的两对数,3表示每组数操作3次:  1,-1, 1-1 = 0)。

          自从看了test3 的数据之后,一下子茅塞顿开啊~~~~

          很容易知道,n < 4 是无解的 !!!

          而1 2 3 4(操作3次,1*2,2*3,6*4) 是可以得出24的,1 2 3 4 5(看代码吧,只是其中一种构造方法) 也能构成24的!!那么剩下的数怎么办?剩下的数保证要操作n-k次。通过后一个减前一个数,得出1,再不断乘以 24,这样就大功告成啦^_^。而且这样做的好处是,不用为后面的有多少对 对数烦恼。试想,一个n个数的序列无非只有两种:最后一个数以奇数结尾或者以偶数结尾。奇数结尾自然调用 1 2 3 4 5 来构成24这个方法;而偶数结尾就用1 2 3 4 能构成24,这样就能保证 n - 4 或者 n - 5 之后的数能成对构成1,再与24相乘即可。

          构造题就是那么考思维呀,但一般不难~~~~想了我大半天= =

         

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 int cnt;
     8 inline void remain(int st, int end)
     9 {
    10     cnt = 0;    // 对数
    11     for (int i = st+1; i <= end; i += 2)
    12     {
    13         cnt++;
    14         printf("%d - %d = 1
    ", i, i-1);
    15     }
    16 }
    17 
    18 inline void Output(int cnt)
    19 {
    20     for (int i = 0; i < cnt; i++)
    21         printf("24 * 1 = 24
    ");
    22 }
    23 
    24 int main()
    25 {
    26     int n;
    27     #ifndef ONLINE_JUDGE
    28         freopen("in.txt", "r", stdin);
    29     #endif // ONLINE_JUDGE
    30 
    31     while (scanf("%d", &n) != EOF)
    32     {
    33         if (n < 4)
    34             printf("NO
    ");
    35         else
    36         {
    37             printf("YES
    ");
    38             if ((n-4) % 2 == 0)
    39             {
    40                 printf("1 * 2 = 2
    ");
    41                 printf("2 * 3 = 6
    ");
    42                 printf("6 * 4 = 24
    ");
    43                 remain(5, n);
    44             }
    45             else
    46             {
    47                 printf("3 * 5 = 15
    ");
    48                 printf("2 * 4 = 8
    ");
    49                 printf("15 + 8 = 23
    ");
    50                 printf("23 + 1 = 24
    ");
    51                 remain(6, n);
    52             }
    53             Output(cnt);
    54         }
    55 
    56     }
    57     return 0;
    58 }

         

  • 相关阅读:
    面试系列14 redis的过期策略都有哪些
    面试系列13 redis都有哪些数据类型
    面试系列12 redis和memcached有什么区别
    面试系列11 缓存是如何使用
    面试系列10 es生产集群的部署架构
    linux命令中的“<”和“|”是什么意思?
    如何征服面试官,拿到Offer [转]
    ddt框架优化(生成html报告注释内容传变量)
    python笔记31-使用ddt报告出现dict() -> new empty dictionary dict(mapping) 问题解决
    测试中 unittest.main(verbosity=1) 是什么意思
  • 原文地址:https://www.cnblogs.com/windysai/p/4004120.html
Copyright © 2011-2022 走看看