HDU 5308

来源:互联网 发布:iptv网络电视 apk 编辑:程序博客网 时间:2024/06/01 08:03

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 longusing 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;}
0 0
原创粉丝点击