HDU 5308 I Wanna Become A 24-Point Master(2015多校联合)


题目链接:戳我

题目大意:

给定一个n,则对应一个长度 2n-1 数组,此数组前 n个数全为 n, 最后一个数必须是24,即 第 2n-1 个数是24。
通过把这n个数加减乘除,每个数都必须用一次,且只能一次,并且运算完的数也都得用一次。也就是做n-1次。
输出过程 xi ? xj 第 i 个数与第 j 个数做 ? 运算 这种形式

样例解释:

4 n = 4 即(a[1]=4,a[2]=4,a[3]=4,a[4]=4)
1 * 2 表示 (a[5] = a[\1] * a[\2] = 16)
5 + 3 表示 (a[6] = a[5] + a[3] = 20)
6 + 4 表示 (a[7] = a[6] + a[4] = 24)
每个数都用了一次,且是 n - 1 次运算,每次运算的数均用上了

解题思路:

官方题解:
此处输入图片的描述

代码

//Author LJH
//www.cnblogs.com/tenlee
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#define clc(a, b) memset(a, b, sizeof(a))
using namespace std;

const int inf = 0x3f;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
int n;

void n15()
{
    int i;
    printf("1 + 2
");
    for(i = 1; i < 2; i++)
    {
        printf("%d + %d
", n+i, i+2);
    }
    printf("%d / 4
", n+2); //n+3 = 3
    printf("5 + 6
"); // n + 4
    for(i = 7;i <= 12; i++)
    {
        printf("%d + %d
", i, n+i-3);
    }
    printf("%d / %d
", n+10, 13); //n+11  8
    printf("%d * %d
", n+3, n+11); //n+12 3*8
    printf("14 - 15
");//n+13
    for(i = n+14; i <= 2*n-2; i++)
    {
        printf("%d * %d
", i-n+2, i-1);
    }
    printf("%d + %d
", n+12, 2*n-2);
}
void n13()
{
    int i;
    printf("1 + 2
");
    for(i = 1; i < 2; i++)
    {
        printf("%d + %d
", n+i, i+2);
    }
    printf("%d / 4
", n+2); //n+3 = 3
    printf("5 + 6
"); // n + 4
    for(i = 7;i <= 12; i++)
    {
        printf("%d + %d
", i, n+i-3);
    }
    printf("%d / %d
", n+10, 13); //n+11  8
    printf("%d * %d
", n+3, n+11); //n+12 3*8
}
void n14()
{
    puts("1 + 2"); //15 2*14
    puts("3 / 4"); //16 1
    puts("5 / 6"); //17 1
    puts("16 + 17");//18 2
    puts("7 / 8"); //19 1
    puts("9 / 10"); //20 1
    puts("19 + 20"); //21 2
    puts("18 + 21");//22 4
    puts("15 - 22"); //23 24
    puts("11 - 12");//24 0
    puts("13 - 14"); //25 0
    puts("24 + 25"); //26 0
    puts("26 + 23");// 27
}
void n4()
{
    printf("1 * 2
"); 
    printf("3 + 5
"); 
    printf("4 + 6
"); 
}
void n5()
{
    printf("1 / 2
"); 
    printf("6 / 3
"); 
    printf("4 - 7
"); 
    printf("5 * 8
"); 
}
void n6()
{
    printf("1 * 2
"); 
    printf("7 - 3
"); 
    printf("8 - 4
"); 
    printf("9 - 5
"); 
    printf("10 + 6
"); 
}
void n7()
{
    printf("1 * 2
"); 
    printf("3 / 4
"); 
    printf("5 + 6
"); 
    printf("8 - 9
"); 
    printf("11 / 10
"); 
    printf("12 * 7
"); 
}
void n8()
{
    printf("1 + 2
"); 
    printf("3 + 9
"); 
    printf("4 - 5
"); 
    printf("6 * 11
"); 
    printf("7 * 12
");
    printf("8 * 13
"); 
    printf("10 + 14
"); 
}
void n9()
{
    printf("1 + 2
"); 
    printf("3 + 10
"); 
    printf("4 / 5
"); 
    printf("6 / 7
"); 
    printf("8 / 9
");
    printf("11 - 12
"); 
    printf("15 - 13
"); 
    printf("16 - 14
");
}
void n10()
{
    puts("1 + 2"); //11 20
    puts("3 / 4");//12 1
    puts("5 / 6");// 13 1
    puts("7 / 8");//14 1
    puts("9 / 10");//15 1
    puts("11 + 12");//16 21
    puts("16 + 13");//17 22
    puts("17 + 14");//18 23
    puts("18 + 15");//18 24
}
void n11()
{
    puts("1 + 2"); //12 22
    puts("12 / 3"); //13 2
    puts("4 + 5");//14 22
    puts("14 + 13"); //15 24
    puts("6 - 7");//16 0
    puts("8 - 9"); //17 0
    puts("10 - 11"); // 18 0
    puts("16 * 17");//19
    puts("18 * 19");//20
    puts("20 + 15");//21
    
}
void n12()
{
    puts("1 + 2"); // 13 24
    puts("3 - 4"); // 14
    puts("14 * 5"); //15
    puts("15 * 6"); //16
    puts("16 * 7");//17
    puts("17 * 8");//18
    puts("18 * 9");//19
    puts("19 * 10");//20
    puts("20 * 11");//21
    puts("21 * 12");//22
    puts("22 + 13");//23
}
int main()
{
    while(~scanf("%d", &n))
    {
        if(n < 4)
        {
            puts("-1");
            continue;
        }
        if(n == 4) n4();
        else if(n == 5) n5();
        else if(n == 6) n6();
        else if(n == 7) n7();
        else if(n == 8) n8();
        else if(n == 9) n9();
        else if(n == 10) n10();
        else if(n == 11) n11();
        else if(n == 12) n12();
        else if(n == 13) n13();
        else if(n == 14) n14();
        else
        {
            n15();
        }
    }
}

标程

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
int n;
int main(){
//	freopen("data.in","r",stdin);
//	freopen("dataa.out","w",stdout);
	while (scanf("%d",&n)!=EOF){
		if (n>=15){
			printf("1 + 2
"); printf("3 + 4
"); printf("5 + 6
"); printf("7 + 8
"); printf("%d + 9
",n+1);
			printf("%d / 10
",n+2); printf("%d / 11
",n+3); printf("%d / 12
",n+4); printf("%d / 13
",n+5);
			printf("%d * %d
",n+6,n+7); printf("%d * %d
",n+8,n+9); printf("%d * %d
",n+10,n+11); printf("14 - 15
");
			int now=n+13; for (int i=16;i<=n;i++){printf("%d * %d
",i,now); now++;} printf("%d + %d
",n+12,now); continue;
		}
		if (n>=12){
			printf("1 + 2
");
			for (int i=1;i<=n*2-24;i++) printf("%d / %d
",i*2+1,i*2+2); int num=n*4-46;
			int now=n+1+n*2-24;
			if (n!=12){
				printf("%d - %d
",n+1,n+2); now++;
				for (int i=2;i<=n*2-24;i++){printf("%d - %d
",now,n+1+i); now++;} 
			}
			int k1=now;
			printf("%d - %d
",num+1,num+2); num+=3; now++;
			for (int i=num;i<=n;i++){printf("%d * %d
",i,now); now++;}
			printf("%d + %d
",k1,now); continue;
		}
		if (n>=10){
			printf("1 + 2
");
			for (int i=1;i<=24-n*2;i++) printf("%d / %d
",1+2*i,2+2*i);
			printf("%d + %d
",n+1,n+2); int now=n+26-n*2;
			for (int i=2;i<=24-n*2;i++) {printf("%d + %d
",n+1+i,now); now++;}
			if (n==10) continue;
			printf("7 - 8
"); printf("17 * 9
"); printf("18 * 10
"); printf("19 * 11
"); printf("20 + 16
"); continue;
		}
		if (n==9){
			printf("1 + 2
"); printf("3 + 10
"); printf("4 / 5
"); printf("6 / 7
"); printf("8 / 9
");
			printf("11 - 12
"); printf("15 - 13
"); printf("16 - 14
"); continue;
		}
		if (n==8){
			printf("1 + 2
"); printf("3 + 9
"); printf("4 - 5
"); printf("6 * 11
"); printf("7 * 12
");
			printf("8 * 13
"); printf("10 + 14
"); continue;
		}
		if (n==7){
			printf("1 * 2
"); printf("3 / 4
"); printf("5 + 6
"); printf("8 - 9
"); printf("11 / 10
"); printf("12 * 7
"); continue;
		}
		if (n<=3){printf("-1
"); continue;}
		if (n==6){
			printf("1 * 2
"); printf("7 - 3
"); printf("8 - 4
"); printf("9 - 5
"); printf("10 + 6
"); continue;
		}
		if (n==5){
			printf("1 / 2
"); printf("6 / 3
"); printf("4 - 7
"); printf("5 * 8
"); continue;
		}
		if (n==4){
			printf("1 * 2
"); printf("3 + 5
"); printf("4 + 6
"); continue;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/tenlee/p/4676243.html