System Message (命题人)
基准时间限制:1 秒 空间限制:131072 KB 分值: 40

小刀和大刀是双胞胎兄弟。今天他们玩一个有意思的游戏。 大刀给小刀准备了一个长度为n的整数序列。小刀试着把这个序列分解成两个长度为n/2的子序列。

这两个子序列必须满足以下两个条件:

1.他们不能相互重叠。

2.他们要完全一样。

如果小刀可以分解成功,大刀会给小刀一些糖果。

然而这个问题对于小刀来说太难了。他想请你来帮忙。

Input
第一行给出一个T,表示T组数据。(1<=T<=5)
接下来每一组数据,输入共2行。
第一行包含一个整数n (2<=n<=40且为偶数)。
第二行给出n个整数a[0],a[1],a[2],…,a[2*n-1]表示大刀给小刀准备的序列。(-1,000,000,000<=a[i]<=1,000,000,000)
Output
如果小刀可以完成游戏,输出"Good job!!" (不包含引号),否则 输出"What a pity!" (不包含引号)。
Input示例
2
4
1 1 2 2
6
1 2 3 4 5 6
Output示例
Good job!!
What a pity!

我个人认为这个题目有两处表述的不是很清晰,我自己一开始也不理解什么意思。第一处是两个子序列不能互相重叠,这个意思应该就是说给出的序列中的数要么是给第一序列,要么给第二序列,不能既属于第一序列,有属于第二序列的意思。(如果我理解错了,还望多多指正)。

另外一点就是

第二行给出n个整数a[0],a[1],a[2],…,a[2*n-1]表示大刀给小刀准备的序列。

这里,给出n个数,怎么会到2*n-1呢,不知道是什么意思。

其实A过之后,再回头看。这道题的意思感觉没必要表述的那么复杂,就是将给出的序列分成两个序列(注意是序列,跟顺序是有关的,所以只统计数量是肯定不行的)。要求分成的两个序列完全相等。

比方说

1 7 10 1 7 4 5 7 1 10 7 4 5 1

这样一个14个数的序列是满足要求的,因为它可以分成

两个1 7 10 7 4 5 1这样的序列。假设我把两个序列设为up[],down[]

原来的序列可以这样表示1(down) 7(down) 10(down) 1(up) 7(down) 4(down) 5(down) 7(up) 1(down) 10(up) 7(up) 4(up) 5(up) 1(up)。所以每个元素都按顺序地分成了两个序列。

我自己的思路是深度搜索,一般来说,会将元素置于down中,符合当前要求的,即与当前down中头元素相等的,可以进入up中,再逐渐这么比较,flag=1就退出,说明OK。down中的元素大于一半了也退出,说明此路不通。

代码:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std; int up[50];
int down[50];
int list[50]; int num,flag; bool pend(int up_size,int down_size)
{
if(up_size!=down_size)
return false;
else
return true;
} void cal(int i,int up_size,int down_size,int cur)
{
if(down_size>(num/2)||flag)
return;
if(i==num+1)
{
if(pend(up_size,down_size))
flag=1;
}
else
{
if(i==1)
{
down[down_size++]=list[1];
cal(i+1,0,down_size,cur);
}
else
{
if(list[i]==down[cur])
{
up[up_size++]=list[i];
cal(i+1,up_size,down_size,cur+1); down[down_size++]=list[i];
cal(i+1,up_size-1,down_size,cur); }
else
{
down[down_size++]=list[i];
cal(i+1,up_size,down_size,cur);
}
}
} } int main()
{ int test;
scanf("%d",&test);
while(test--)
{
int i;
scanf("%d",&num);
flag=0; for(i=1;i<=num;i++)
{
scanf("%d",&list[i]);
}
cal(1,0,0,0); if(flag)
cout<<"Good job!!"<<endl;
else
cout<<"What a pity!"<<endl;
} return 0;
}

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

51nod 算法马拉松3 A:序列分解的更多相关文章

  1. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  2. 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)

    题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...

  3. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  4. 51Nod 算法马拉松21(迎新年)

    这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...

  5. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛

    OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...

  6. 51Nod 算法马拉松22 开黑记

    这是一场惨烈的开黑大战,始于全机房开黑指望刷进rank前十拿钱的壮志,终于被各路神犇怒踩成rank20,差点200点头盾不保的落魄,想起将近一年前ad和zcg等学长挤进rank10的壮举,不由得唏嘘, ...

  7. 【python cookbook】【数据结构与算法】1将序列分解为单独的变量

    如果对象是可迭代的(任何序列),则可以进行分解操作,包括元组.列表.字符串.文件.迭代器以及生成器,可通过简单的一个赋值操作分解为单独的变量. 唯一要求:变量的总数和序列相吻合,否则将出错: Pyth ...

  8. 51Nod 算法马拉松23 开黑记

    惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...

  9. 51nod 算法马拉松17 解题报告 以后不能赛中写题解(查逐梦者抄袭本人代码...

    B题(数学题: 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式  如果可以 输出 m%1e9+7 否则 输出no n<=1e18 刚看题没思路 暴力一下 ...

随机推荐

  1. Linux CentOS7 VMware 特殊权限set_uid、特殊权限set_gid、特殊权限stick_bit、软链接文件、硬连接文件

    一.特殊权限set_uid root用户本身拥有对/etc/passwd的写权限,无可厚非:那普通用户呢,这里就用到了setuid,setuid的作用是“让执行该命令的用户以该命令拥有者的权限去执行” ...

  2. django 配置404,500页面

    JSP CURL session COOKIE diango 自定义404 500页面     1.首先将settings设置debug=false;             2.设置static路径 ...

  3. 清除DNS解析缓存

    接下来在弹出的命令提示符窗口中输入“ipconfig /displaydns”,我们会看到系统中有多条我们之前使用过的DNS地址,如下图所示 5 然后,我们接着输入命令“ipconfig /flush ...

  4. 树莓派学习笔记——Restful服务 采用slim php apache

    0.前言     前些时间沉迷于Restful,采用PHP+Slim+MySQL实现了一些简单的API函数.但是这些工作都是在windows中实现(采用wamp server集成安装包),但是转到li ...

  5. SciPy 安装

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  6. Java8 使用LocalDate计算两个日期间隔多少年,多少月,多少天

    最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的Date和Calendar类会有点复杂,刚好项目使用了JDK8,那就利用起来这个新特性,上代码: ...

  7. 图形与动画在Android中的实现

    public class MyView extends View{ Bitmap myBitmap; Paint paint; public MyView(Context context, Attri ...

  8. JDK8中的HashMap实现原理及源码分析

    大纲 一.什么是Hash?什么是HashMap? 二.HashMap的内部实现机制 1.HashMap基本元素 ①DEFAULT_INITIAL_CAPACITY&MAXIMUM_CAPACI ...

  9. lpwizard 生成的 allegro 封装中 .psx 文件使用方法。

    lpwizard 有时候生成 allegro 封装的时候会生成 .psx 文件,这个文件其实是脚本文件,用于某些特殊形状焊盘的处理. 具体的使用方法如下: 在Allegro中,选择 File > ...

  10. wincc的服务器-客户机模式具体做法(全抄-未测试)

    一.原来的工作方式:在同一工作组中4台计算机其windows名分别为A.B.C.D且都已安装好wincc5.0+sp2,原来在每台计算机上运行的均是单用户,4台计算机上实际运行的是一个相同的项目,最先 ...