[多校2015.02.1009 构造] hdu 5308 I Wanna Become A 24-Point Master

题意:

给你n个数,每个数都是n,

然后把这n个数加减乘除,每个数都必须用一次,且只能一次,并且运算完的数也都得用一次。

也就是做n-1次,问能不能得到24,输出过程 xi ? xj  第i个数与第j个数做?运算 这种形式

思路:

因为n有可能很大,那么肯定需要一种完美的构造

最简单的方法是构造出4*6

构造出4需要5个数,构造出6需要7个数

也就是最少需要12个数,剩下的数就是相减为0,然后乘就好了

但是需要注意的就是13是不满足这个规律的

所以1~13特判一下,14以上的按规律输出就好了~

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=-1)
    {
        if(n<=3)
        {
            puts("-1");
            continue;
        }
        if(n==4)
        {
            puts("1 * 2");
            puts("5 + 3");
            puts("6 + 4");
            continue;
        }
        if(n==5)
        {
            puts("1 * 2");
            puts("6 * 3");
            puts("7 - 4");
            puts("8 / 5");
            continue;
        }
        if(n==6)
        {
            puts("1 + 2");
            puts("3 + 4");
            puts("5 - 6");
            puts("7 + 8");
            puts("9 + 10");
            continue;
        }
        if(n==7)
        {
            puts("1 + 2");
            puts("8 + 3");
            puts("9 / 4");
            puts("5 / 6");
            puts("7 + 11");
            puts("12 * 10");
            continue;
        }
        if(n==8)
        {
            puts("1 + 2");
            puts("9 + 3");
            puts("5 - 4");
            puts("6 * 11");
            puts("7 * 12");
            puts("8 * 13");
            puts("10 + 14");
            continue;
        }
        if(n==9)
        {
            puts("1 / 2");  //10  1
            puts("3 - 10"); //11  8
            puts("4 + 5");  //12 18
            puts("12 + 6"); //13 27
            puts("13 / 7"); //14  3
            puts("11 * 14");//15 24
            puts("8 - 9");  //16  0
            puts("15 + 16");
            continue;
        }
        if(n==10)
        {
            puts("1 + 2");  //11 20
            puts("3 + 4");  //12 20
            puts("5 + 6");  //13 20
            puts("7 - 8");  //14 0
            puts("9 * 14"); //15 0
            puts("12 + 13");//16 40
            puts("16 / 10");//17 4
            puts("17 + 11");//18 24
            puts("18 + 15");
            continue;
        }
        if(n==11)
        {
            puts("1 + 2");  //12 22
            puts("3 + 4");  //13 22
            puts("13 / 5"); //14 2
            puts("14 + 12");//15 24
            puts("6 - 7");  //16 0
            puts("8 * 16"); //17 0
            puts("9 * 17"); //18 0
            puts("10 * 18");//19 0
            puts("11 * 19");//20 0
            puts("20 + 15");//21 24
            continue;
        }
        if(n==12)
        {
            puts("1 + 2"); //13 2n
            printf("%d + 3\n",n+1); //14 3n
            printf("%d + 4\n",n+2); //15 4n
            printf("%d + 5\n",n+3); //16 5n
            printf("%d + 6\n",n+4); //17 6n
            printf("%d / 7\n",n+5); //18(n+6) 6
            puts("8 + 9"); //19 2n
            printf("%d + 10\n",n+7); //20 3n
            printf("%d + 11\n",n+8); //21 4n
            printf("%d / 12\n",n+9); //22(n+10) 4
            printf("%d * %d\n",n+6,n+10); //23(n+11) 24
            continue;
        }
        if(n==13)
        {
            puts("1 / 2");  //14 1
            puts("3 - 14"); //15 12
            puts("4 + 5");  //16 26
            puts("16 / 6"); //17 2
            puts("15 * 17");//18 24
            puts("7 - 8");  //19 0
            puts("9 * 19"); //20 0
            puts("10 * 20"); //21 0
            puts("11 * 21"); //22 0
            puts("12 * 22"); //23 0
            puts("13 * 23"); //24 0
            puts("24 + 18"); //25 24
            continue;
        }
        puts("1 + 2"); //13 2n
        printf("%d + 3\n",n+1); //14 3n
        printf("%d + 4\n",n+2); //15 4n
        printf("%d + 5\n",n+3); //16 5n
        printf("%d + 6\n",n+4); //17 6n
        printf("%d / 7\n",n+5); //18(n+6) 6
        puts("8 + 9"); //19 2n
        printf("%d + 10\n",n+7); //20 3n
        printf("%d + 11\n",n+8); //21 4n
        printf("%d / 12\n",n+9); //22(n+10) 4
        printf("%d * %d\n",n+6,n+10); //23(n+11) 24
        puts("13 - 14");//n+12 0
        int tep=n+12;
        for(int i=15;i<=n;i++)
        {
            printf("%d * %d\n",i,tep);
            tep++;
        }
        printf("%d + %d\n",n+11,tep);
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值