HDU5308-脑补-对拍

先贴上对拍的结果:



感想:可以明显发现下标相差1的关系,所以对付这种需要大量脑补的水题,真的蛋疼,以前没用过对拍,只知道有这么回事,调程序什么的都是手算,人工模拟(经常大脑发热,严重缺氧不足),所以试过一次对拍之后,其实感觉对付YY这种水题,特别管用。。。

题意:给一个n值,代表n个n,利用+,-,*,/四种运算构造出24点来,每个数只能用一次,且经过一次运算后的数也只能用一次,打印出运算过程。

思路:属于脑洞大开的题目,真的需要很强的YY能力,首先1-3肯定不可以,输出-1,然后剩下的数,因为要凑够24这个值,所以你可以分成24=4*6,那么yy下,(n+n+n+n)/n=4,6也是同样的道理,所以这样就需要12个n来凑24这个值,那么后面的数只要全部为0即可,但是特殊的是13这个值,因为12个数你用完了,还有一个怎么也不可能为0,所以这里要yy下怎么取,13以后的数规律都是这样的,所以你只要yy4-13这些值即可,另外yy完后,这个代码写起来特别蛋疼,我不说什么了,可以自己试试。


#include <iostream>
#include <stdio.h>
using namespace std;

void solve(int n)
{
    string str[] =
    {

        "-1",
        "-1",
        "-1",
        "1 * 2\n5 + 3\n6 + 4",
        "1 * 2\n6 * 3\n7 - 4\n8 / 5",
        "1 + 2\n7 + 3\n8 + 4\n9 + 5\n10 - 6",
        "1 + 2\n8 + 3\n4 + 5\n10 + 6\n11 / 7\n9 + 12",
        "1 + 2\n9 + 3\n4 + 5\n11 - 6\n12 - 7\n13 / 8\n10 + 14",
        "1 + 2\n10 + 3\n4 + 5\n12 + 6\n13 / 7\n11 - 14\n15 - 8\n16 + 9",
        "1 + 2\n3 + 4\n12 + 5\n13 + 6\n14 / 7\n11 + 15\n8 - 9\n17 / 10\n16 + 18",
        "1 + 2\n3 + 4\n13 / 5\n12 + 14\n15 - 6\n16 + 7\n17 - 8\n18 + 9\n19 - 10\n20 + 11",
        "1 + 2\n3 + 13\n4 + 14\n5 + 6\n7 + 16\n8 + 17\n9 + 15\n10 + 19\n18 / 11\n20 / 12\n21 * 22",
        "1 + 2\n3 + 4\n15 / 5\n14 - 16\n17 - 6\n18 + 7\n19 - 8\n20 + 9\n21 - 10\n22 + 11\n23 - 12\n24 + 13",
        // "1 + 2\n3 + %d\n4 + %d\n5 + 6\n7 + %d\n8 + %d\n9 + %d\n10 + %d\n%d / 11\n%d / 12\n%d * %d\n"
    };
    cout<<str[n-1]<<endl;
}
void solve1(int n)
{

    // printf("1 + 2\n3 + %d\n4 + %d\n5 + 6\n7 + %d\n8 + %d\n9 + %d\n10 + %d\n11 - 12\n%d * %d\n",n+1,n+2,n+4,n+5,n+6,n+7);
    // for(int i=1;i<=n-14;i++)
    //    printf("%d * %d\n",n+9+i-1,14+i);
    //printf("%d * %d\n%d / 13\n%d / 14\n%d + %d\n",n+3,n+8,n+10,n+11,n+12,n+9);
    printf("1 + 2\n3 + %d\n4 + %d\n5 + 6\n7 + %d\n8 + %d\n9 + %d\n10 + %d\n%d / 11\n%d / 12\n%d * %d\n13 - 14\n",n+1,n+2,n+4,n+5,n+3,n+7,n+6,n+8,n+9,n+10);
    for(int i = 15,k=0; i <= n; ++i,k++)
        printf("%d * %d\n",i,n+12+k);
    printf("%d + %d\n",n + 11,2*n-2);

}

int main()
{
    int n;
    while(cin>>n)
    {
        if(n<=13)
            solve(n);
        if(n>=14)
            solve1(n);
    }
}


posted @ 2015-07-26 15:27  __夜风  阅读(165)  评论(0编辑  收藏  举报