HDU 5308

HDU 5308

手工一个个算过去,发现
n=12时,我们可以通过(x+x+x+x)/x*(x+x+x+x+x+x)/x=24,来得到24点。
n=13时,构造(x+x+x)/x*(x+x+x+x +x+x+x+x)/x=24,来得到24点。
当n>13时,
1)n为奇数,我们可以通过一加一减多余的x来使x只剩13个,并应用上方n=13时的式子来得到24点;
2)n为偶数,同理,一加一减消去多余的x,并应用n=12时的式子。
所以我们只用手动算出n<12时的式子即可,当然嫌麻烦也可以写个程序深搜一下。

#include<map>
#include<cmath>
#include<ctime>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string>
#define LL long long
using namespace std;
const int maxn=10005;
const LL Inf=1e18;
int n, m, x, y;
void solve(){
    if(n<4){
        puts("-1");
        return;
    }
    if(n<12){
        if(n==4){
            puts("1 * 2"); puts("5 + 3");
            puts("6 + 4");
        }else if(n==5){
            puts("1 / 2"); puts("6 / 3");
            puts("4 - 7"); puts("8 * 5");
        }else if(n==6){
            puts("1 + 2"); puts("7 + 3");
            puts("8 + 4"); puts("9 + 5");
            puts("10 - 6");
        }else  if(n==7){
            puts("1 + 2"); puts("8 + 3");
            puts("9 / 4"); puts("10 + 5");
            puts("11 + 6"); puts("12 + 7");
        }else if(n==8){
            puts("1 + 2"); puts("9 / 3");
            puts("4 / 5"); puts("10 + 11");
            puts("6 + 7"); puts("13 - 8");
            puts("12 * 14");
        }else if(n==9){
            puts("1 + 2"); puts("10 + 3");
            puts("11 / 4"); puts("12 * 5");
            puts("6 + 7"); puts("14 + 8");
            puts("15 / 9"); puts("13 - 16");
        }else if(n==10){
            puts("1 + 2"); puts("11 + 3");
            puts("4 + 5"); puts("13 + 6");
            puts("14 + 7"); puts("15 + 8");
            puts("16 + 9"); puts("17 / 10");
            puts("12 - 18");
        }else if(n==11){
            puts("1 + 2"); puts("3 + 4");
            puts("13 / 5"); puts("12 + 14");
            puts("15 + 6"); puts("16 - 7");
            puts("17 + 8"); puts("18 - 9");
            puts("19 + 10"); puts("20 - 11");
        }
        return ;
    }
    if(n%2){
        puts("1 + 2");
        printf("3 + %d\n",n+1);
        printf("%d / 4\n",n+2);
        puts("5 + 6");
        printf("7 + %d\n",n+4);
        printf("8 + %d\n",n+5);
        printf("9 + %d\n",n+6);
        printf("10 + %d\n",n+7);
        printf("11 + %d\n",n+8);
        printf("12 + %d\n",n+9);
        printf("%d / 13\n",n+10);
        printf("%d * %d\n",n+3, n+11);
        for(int i=n+12,j=14;j<=n;i+=2, j+=2){
            printf("%d + %d\n",i, j);
            printf("%d - %d\n",i+1, j+1);
        }
    }else{
        puts("1 + 2");
        printf("3 + %d\n",n+1);
        printf("4 + %d\n",n+2);
        printf("%d / 5\n",n+3);
        puts("6 + 7");
        printf("8 + %d\n",n+5);
        printf("9 + %d\n",n+6);
        printf("10 + %d\n",n+7);
        printf("11 + %d\n",n+8);
        printf("%d / 12\n",n+9);
        printf("%d * %d\n",n+4, n+10);
        for(int i=n+11,j=13;j<=n;i+=2,j+=2){
            printf("%d + %d\n",i, j);
            printf("%d - %d\n",i+1, j+1);
        }
    }
}
int main(){

//      freopen("matrix.in","r",stdin);//从in.txt中读取数据
//      freopen("matrix.out","w",stdout);//输出到out.txt文件

    while(~scanf("%d",&n)){
        solve();
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值