HDU 5308 I Wanna Become A 24-Point Master(找规律+模拟)

I Wanna Become A 24-Point Master

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 497    Accepted Submission(s): 200


Problem Description
Recently Rikka falls in love with an old but interesting game -- 24 points. She wants to become a master of this game, so she asks Yuta to give her some problems to practice.

Quickly, Rikka solved almost all of the problems but the remained one is really difficult:

In this problem, you need to write a program which can get 24 points with  n  numbers, which are all equal to  n .
 

Input
There are no more then 100 testcases and there are no more then 5 testcases with  n100 . Each testcase contains only one integer  n (1n105)
 

Output
For each testcase:

If there is not any way to get 24 points, print a single line with -1.

Otherwise, let  A  be an array with  2n1  numbers and at firsrt  Ai=n (1in) . You need to print  n1  lines and the  i th line contains one integer  a , one char  b and then one integer c, where  1a,c<n+i  and  b  is "+","-","*" or "/". This line means that you let  Aa  and  Ac  do the operation  b  and store the answer into  An+i .

If your answer satisfies the following rule, we think your answer is right:

1.  A2n1=24

2. Each position of the array  A  is used at most one tine.

3. The absolute value of the numerator and denominator of each element in array  A  is no more than  109
 

Sample Input
  
  
4
 

Sample Output
  
  
1 * 2 5 + 3 6 + 4
 

题目大意:给出n个数,每个数的值都是n,将这些数每两个进行加减乘除运算中的一种,每个数都要用一次,且只能用一次,并且运算出的数也得用一次,即做(n-1)次运算(中间过程可以产生浮点数),问能不能得到24,输出运算过程中的xi和yi。

解题思路:

当n=1时,明显得不到24;

当n=2时,明显得不到24;

当n=3时,一共有16种运算方法,按照结果由大到小排列:3*3*3=27,3+3*3=12,3*3+3=12,3+3+3=9,……………。得不到24;

当n=4时,4*4+4+4=24;

当n=5时,5*(5-5/5/5)=24;(5/5/5每次计算保留为浮点数)

当n=6时,6+6+6+6+6-6=24;

当n=7时,(7*7-7/7)/(7+7)*7=24;(每次除法运算保留为浮点数)

当n=8时,8+8+8+(8-8)*8*8*8=24;

当n=9时,9+9+9-9/9-9/9-9/9=24;(每次除法运算保留为浮点数)

当n=10时,10+10+10/10+10/10+10/10+10/10=24;(每次除法运算保留为浮点数)

当n=11时,11+11+11/11+11/11+(11-11)*11*11*11=24;

当n=12时,(12+12)*(12/12)*(12/12)*(12/12)*(12/12)*(12/12)=24;

当n=13时,13+13-13/13-13/13+(13-13)*13*13*13*13*13=24;

当n=14时,(14+14-14/14-14/14-14/14-14/14)*(14/14)*(14/14)=24;

当n=15时,(15+15)/15*(15+15)/15*(15+15)/15*(15+15+15)/15+(15-15)=24;

当n=16时,(16+16)/16*(16+16)/16*(16+16)/16*(16+16+16)/16+(16-16)*16=24;

当n=17时,(17+17)/17*(17+17)/17*(17+17)/17*(17+17+17)/17+(17-17)*17*17=24;

当n=18时,(18+18)/18*(18+18)/18*(18+18)/18*(18+18+18)/18+(18-18)*18*18*18=24;

…………         ……………………………………        ………………

当n比较大时(即n>=15时),如果n个数未用完就已经得到了24,那么剩余奇数个数n的话,就可以利用两个数n相减的零与剩余未用的数n相乘得结果零与24相加即可;剩余偶数个数n的话,就可以利用每两个数n相除得1再连续相乘,最后与24相乘即可。

当n比较小时(即n<=3时),无法得到24。

当n介于这两者之间时,就需要特殊处理。


代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#include <limits.h>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-4)
#define inf (1<<28)
#define sqr(x) (x) * (x)
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
int main()
{
    int i,j,k,n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n<=3)
            printf("-1\n");
        else if(n==4)
        {
            printf("1 * 2\n");//5
            printf("3 + 5\n");//6
            printf("4 + 6\n");//7
        }
        else if(n==5)
        {
            printf("1 / 2\n");//6
            printf("6 / 3\n");//7
            printf("4 - 7\n");//8
            printf("5 * 8\n");//9
        }
        else if(n==6)
        {
            printf("1 + 2\n");//7
            printf("3 + 7\n");//8
            printf("4 + 8\n");//9
            printf("9 + 5\n");//10
            printf("10 - 6\n");//11
        }
        else if(n==7)
        {
            printf("1 * 2\n");//8
            printf("3 / 4\n");//9
            printf("8 - 9\n");//10
            printf("5 + 6\n");//11
            printf("10 / 11\n");//12
            printf("12 * 7\n");//13
        }
        else if(n==8)
        {
            printf("1 + 2\n");//9
            printf("9 + 3\n");//10
            printf("4 - 5\n");//11
            printf("11 * 6\n");//12
            printf("12 * 7\n");//13
            printf("13 * 8\n");//14
            printf("10 + 14\n");//15
        }
        else if(n==9)
        {
            printf("1 + 2\n");//10
            printf("3 + 10\n");//11
            printf("4 / 5\n");//12
            printf("6 / 7\n");//13
            printf("8 / 9\n");//14
            printf("11 - 12\n");//15
            printf("15 - 13\n");//16
            printf("16 - 14\n");//17
        }
        else if(n==10)
        {
            printf("1 + 2\n");//11
            printf("3 / 4\n");//12
            printf("5 / 6\n");//13
            printf("7 / 8\n");//14
            printf("9 / 10\n");//15
            printf("11 + 12\n");//16
            printf("16 + 13\n");//17
            printf("17 + 14\n");//18
            printf("18 + 15\n");//19
        }
        else if(n==11)//
        {
            printf("1 + 2\n");//12
            printf("3 / 4\n");//13
            printf("5 / 6\n");//14
            printf("7 - 8\n");//15
            printf("15 * 9\n");//16
            printf("16 * 10\n");//17
            printf("17 * 11\n");//18
            printf("18 + 12\n");//19
            printf("19 + 13\n");//20
            printf("20 + 14\n");//21
        }
        else if(n==12)//
        {
            printf("1 + 2\n");//13
            printf("3 / 4\n");//14
            printf("5 / 6\n");//15
            printf("7 / 8\n");//16
            printf("9 / 10\n");//17
            printf("11 / 12\n");//18
            printf("13 * 14\n");//19
            printf("19 * 15\n");//20
            printf("20 * 16\n");//21
            printf("21 * 17\n");//22
            printf("22 * 18\n");//23
        }
        else if(n==13)//
        {
            printf("1 + 2\n");//14
            printf("3 / 4\n");//15
            printf("5 / 6\n");//16
            printf("7 - 8\n");//17
            printf("17 * 9\n");//18
            printf("18 * 10\n");//19
            printf("19 * 11\n");//20
            printf("20 * 12\n");//21
            printf("21 * 13\n");//22
            printf("22 + 14\n");//23
            printf("23 - 15\n");//24
            printf("24 - 16\n");//25
        }
        else if(n==14)//
        {
            printf("1 + 2\n");//15
            printf("3 / 4\n");//16
            printf("5 / 6\n");//17
            printf("7 / 8\n");//18
            printf("9 / 10\n");//19
            printf("11 / 12\n");//20/
            printf("13 / 14\n");//21/
            printf("15 - 16\n");//22
            printf("22 - 17\n");//23
            printf("23 - 18\n");//24
            printf("24 - 19\n");//25
            printf("25 * 20\n");//26
            printf("26 * 21\n");//27
        }
        else if(n>=15)
        {
            printf("1 + 2\n");//n+1/
            printf("3 + 4\n");//n+2/
            printf("5 + 6\n");//n+3/
            printf("7 + 8\n");//n+4/
            printf("%d + 9\n",n+4);//n+5/
            printf("%d / 10\n",n+1);//n+6/
            printf("%d / 11\n",n+2);//n+7/
            printf("%d / 12\n",n+3);//n+8/
            printf("%d / 13\n",n+5);//n+9/
            printf("%d * %d\n",n+9,n+6);//n+10/
            printf("%d * %d\n",n+10,n+7);//n+11/
            printf("%d * %d\n",n+11,n+8);//n+12
            printf("14 - 15\n");//n+13
            for(i=16,j=n+13;i<=n;i++,j++)
                printf("%d * %d\n",i,j);//i+1
            printf("%d + %d\n",n+12,j);//j+1
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值