HDOJ 5308 I Wanna Become A 24-Point Master 构造

构造题,前面十几个手工处理....

n很大时有很多构造方法,一阵乱搞就可以了......

I Wanna Become A 24-Point Master

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 128    Accepted Submission(s): 36

Special Judge

Problem Description

Recently Rikka falls in love with an old but interesting game -- 24 points. She wants to become a master of this game, so she asks Yuta to give her some problems to practice.

Quickly, Rikka solved almost all of the problems but the remained one is really difficult:

In this problem, you need to write a program which can get 24 points with n numbers,
which are all equal to n.

Input

There are no more then 100 testcases and there are no more then 5 testcases with n≥100.
Each testcase contains only one integer n (1≤n≤105)

Output

For each testcase:

If there is not any way to get 24 points, print a single line with -1.

Otherwise, let A be
an array with 2n?1 numbers
and at firsrt Ai=n (1≤i≤n).
You need to print n?1 lines
and the ith
line contains one integer a,
one char b and
then one integer c, where 1≤a,c<n+i and b is
"+","-","*" or "/". This line means that you let Aa and Ac do
the operation b and
store the answer into An+i.

If your answer satisfies the following rule, we think your answer is right:

1. A2n?1=24

2. Each position of the array A is
used at most one tine.

3. The absolute value of the numerator and denominator of each element in array A is
no more than 109

Sample Input

4

Sample Output

1 * 2
5 + 3
6 + 4

Source

2015 Multi-University Training Contest 2

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
using namespace std;

int dy[55];

void db(int x )
{
    if ( x==1)
        printf("-1\n");
    if ( x==2)
        printf("-1\n");
    if ( x==3)
        printf("-1\n");
    if ( x==4)
    {
        puts("1 * 2");
        puts("5 + 3");
        puts("6 + 4");
    }
    if ( x==5)
    {
        puts("1 / 2");
        puts("6 / 3");
        puts("4 - 7");
        puts("5 * 8");
    }
    if ( x==6)
    {
        puts("1 + 2");
        puts("7 + 3");
        puts("8 + 4");
        puts("9 * 5");
        puts("10 / 6");
    }
    if ( x==7)
    {
        puts("1 * 2");   //   8
        puts("3 / 4");   //   9
        puts("8 - 9");   //   10
        puts("5 + 6");   //   11
        puts("11 / 7");  //   12
        puts("10 / 12");   // 13
    }
    if ( x==8)
    {
        puts("1 + 2");   //   9
        puts("3 + 9");   //   10
        puts("4 - 5");   //   11
        puts("11 * 6");  //  12
        puts("12 * 7");   // 13
        puts("13 * 8");   // 14
        puts("10 + 14");   //  15
    }
    if ( x==9 )
    {
        puts("1 + 2");   // 10
        puts("10 + 3");
        puts("11 + 4");
        puts("12 + 5");
        puts("13 + 6");  // 14
        puts("14 / 7");  // 15
        puts("15 + 8");
        puts("16 + 9");
    }
    if ( x== 10)
    {
        puts("1 / 2");  //11
        puts("3 / 4");  //12
        puts("5 / 6");  // 13
        puts("7 / 8");  // 14
        puts("9 + 10");  //15
        puts("15 + 11");
        puts("16 + 12");
        puts("17 + 13");
        puts("18 + 14");
    }
    if ( x== 11)
    {
        puts("1 + 2");   //12
        puts("12 / 3");   // 13
        puts("13 * 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
    }
    if ( x== 12)
    {
        puts("1 + 2");   // 13
        puts("13 + 3");   // 14
        puts("14 - 4");
        puts("15 + 5");
        puts("16 - 6");
        puts("17 + 7");
        puts("18 - 8");
        puts("19 + 9");
        puts("20 - 10");
        puts("21 + 11");
        puts("22 - 12");
    }

    if (x == 24)
    {
        puts("1 - 2");
        puts("25 * 3");
        puts("26 * 4");
        puts("27 * 5");
        puts("28 * 6");
        puts("29 * 7");
        puts("30 * 8");
        puts("31 * 9");
        puts("32 * 10");
        puts("33 * 11");
        puts("34 * 12");
        puts("35 * 13");
        puts("36 * 14");
        puts("37 * 15");
        puts("38 * 16");
        puts("39 * 17");
        puts("40 * 18");
        puts("41 * 19");
        puts("42 * 20");
        puts("43 * 21");
        puts("44 * 22");
        puts("45 * 23");
        puts("46 + 24");
    }
    if (x == 26)
    {
        puts("1 / 2");   //  27
        puts("3 / 4");   // 28
        puts("27 + 28");   //  29
        puts("5 - 29");   // 30
        puts("30 * 6");
        puts("31 / 7");
        puts("32 * 8");
        puts("33 / 9");
        puts("34 * 10");
        puts("35 / 11");
        puts("36 * 12");
        puts("37 / 13");
        puts("38 * 14");
        puts("39 / 15");
        puts("40 * 16");
        puts("41 / 17");
        puts("42 * 18");
        puts("43 / 19");
        puts("44 * 20");
        puts("45 / 21");
        puts("46 * 22");
        puts("47 / 23");
        puts("24 - 25");
        puts("49 * 26");
        puts("48 + 50");

    }
}

void solve25()
{
    int n = 25;
    int t = 1, e = dy[n + 1];
    printf("%d + %d\n", dy[t], dy[t + 1]);
    t += 2;
    for(int i = 0; i < 22; i++)
    {
        printf("%d + %d\n", dy[t++], e++);
    }
    printf("%d / %d\n", e++, dy[t++]);
}

void xiao(int n, int c)
{
    int t = 1, e = n + 1;
    printf("%d - %d\n", t, t + 1);
    t += 2;
    for(int i = 2; i < c; i++)
    {
        printf("%d * %d\n", t++, e++);
    }
    printf("%d + %d\n", e++, t++);
    int i;
    //printf("n - c = %d\n", n - c);
    for(i = 1; i < n - c; i++)
    {
        dy[i] = t++;
    }
    for(; i <= 55; i++)
    {
        dy[i] = e++;
    }
    //printf("*****%d\n", dy[26]);
    //for(int i = 1; i <= 26; i++) printf("%d ", dy[i]);printf("\n");
}

void solve24(int n)
{
    if(n == 26)
    {
        return;
    }
    for(int i = 1; i <= 88; i++) dy[i] = i;
    if(n >= 27)
    {
        xiao(n, n - 25);
    }
    solve25();
}

void solve13(int n)
{
    for(int i = 1; i < 55; i++) dy[i] = i;
    if(n > 13)
    {
        xiao(n, 2 * n - 26);
    }
    int m = 26 - n;
    int t = 1, e = dy[m + 1];
    if(m > 3)
    {
        printf("%d + %d\n", dy[t], dy[t + 1]);
        t += 2;
    }
    else
    {
        e--;
    }
    for(int i = 0; i < m - 4; i++)
    {
        printf("%d + %d\n", dy[t++], e++);
    }
    printf("%d / %d\n", e++, dy[t++]);
    printf("%d + %d\n", dy[t++], e++);
}

void solve(int n)
{
    if(n>=1&&n<=12) db(n);
    else if(n==24||n==26) db(n);
    else if(n > 24)
    {
        solve24(n);
    }
    else if(n >= 13)
    {
        solve13(n);
    }
}

int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        solve(n);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 14:08:17

HDOJ 5308 I Wanna Become A 24-Point Master 构造的相关文章

HDU 5308 I Wanna Become A 24-Point Master

I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 366    Accepted Submission(s): 141 Special Judge Problem Description Recently Rikka falls in love with an old bu

HDU 5308 I Wanna Become A 24-Point Master(2015多校第二场)

I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 485    Accepted Submission(s): 191 Special Judge Problem Description Recently Rikka falls in love with an old bu

[模拟] 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以上的按规律输出就好了~

hdu5308 I Wanna Become A 24-Point Master(构造)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5308 题意:给定N个N,求出将这N个N构造成24的方法. 分析:要是想到用尽量少的N构造出24点((N+N)/N * (N+N)/N * (N+N)/N * (N*N+N)/N),然后把多的N构造成0就好办了((N-N)*N*.....). 代码: #include <iostream> #include <cstdio> #include <algorithm> using

贪心 赛码 1001 Movie

题目传送门 1 /* 2 贪心:官方题解: 3 首先我们考虑如何选择最左边的一个区间 4 假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri 5 若存在i之外的j, 满足Rj<Ri, 那么另外两个区间的选择余地必定不会减少 6 因此,为了使另外两个区间有尽可能多的选择,我们选择一个右端点最小的区间作为最左边的区间是最好的 7 同理,我们选择一个左端点最大的区间作为最右边的区间,也将提供最多的选择 8 确定了这两个区间之后,只需判断是否存在一个区间位于它们中间且不交叉即可 9

继承的构造和析构顺序

程序示例 1 #include <iostream> 2 using namespace std; 3 class a 4 { 5 public: 6 a(){cout<<"构造a"<<endl;} 7 ~a(){cout<<"析构a"<<endl;} 8 }; 9 class b 10 { 11 public: 12 b(){cout<<"构造b"<<endl;

keepalived简单案例

---------------------------------- 一.前言 二.环境 三.Keepalived体系架构 四.安装Keepalived 五.案例配置 ---------------------------------- 一.前言 keepalived是一个类似于layer3,4&5交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的

【模板小程序】链表排序(qsort/insert_sort/merge_sort)

前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 二.模板版本(适用性广泛) 文中链表定义 链表相关操作 三种排序方法 完整测试程序 总结 参考文章 一.针对整数的版本(常用) 文中链表定义: 1 //definition for singly-linked list. 2 struct ListNode 3 { 4

通过MMM构建MYSQL高可用集群系统

本文为南非蚂蚁的书籍<循序渐进linux-第二版>-8.4的读笔记 MMM集群套件(MYSQL主主复制管理器) MMM套件主要的功能是通过下面三个脚本实现的 1)mmm_mond 这是一个监控进程,运行在管理节点上,主要负责都所有数据库的监控工作,同时决定和处理所有节点的角色切换 2)mmm_agentd 这是一个代理进程,运行在每个MYSQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置 3)mmm_control 简单的管理脚本,用来查看和管理集群运行状态,同事管理mmm_mo