51nod 1400 序列分解 阻止我的只有读题能力了

来源:互联网 发布:怀卡托理工学院 知乎 编辑:程序博客网 时间:2024/05/15 13:49

1400 序列分解
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注

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

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

1.他们不能相互重叠。

2.他们要完全一样。

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

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


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


这个题 - -  ,可能是我语文差吧。。。

读了一天没读懂 第二天看题解突然读懂题了 

然后秒造代码。 代码出来都是差不多的。

阻止我的只有读题能力了。读题啊读题。心塞。


1.他们不能相互重叠。

2.他们要完全一样。


第一句话的意思是  指针一直向后推 , 然后把数字选择放到A集合或者B集合。

第二个 变成完全相等的两个集合  嗯 顺序都要一样 。

比较浅显的例子


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

首先  1  7 10 进入A集合。

之后 又碰到一个1  这时候就有两种情况了  1 要么还是A集合里的  要么是B集合里的 


A:1  7  10 

B:1

这时候 又碰到一个7  两种情况了 这个7要么是A集合里的,要么是B集合里的。  这时候 放到A集合里。

嗯  只是为了理解题意

A:1 7 10 7 4 5 1

B:1 7 10 7 4 5 1  

然后 顺序出来这两个集合  


大致意思   再解释一遍。

每次 遇到的数字,要么是集合A里的   要么是集合B里的  

但是  两个集合  最后能分成完全一样的   连顺序都是一样的 才算完全一样  

比如上述  如果碰到7的时候 放到B里面了  那就无法分成两个一样的了 


这时候就用搜索搜出所有情况



#include<iostream>#include<cstring>#include<iomanip>#include<cmath>#include <string>#include <cstdio>#include <algorithm>#include <map>#include <queue>using namespace std;const int inf=-1000000001;int a[100];int tag[100];int n,flag;void dfs(int now,int sum){    if(flag==1)return ;    if(sum>n/2)return ;    if(now==n&&sum==n/2)    {        //for(int i=0;i<n;i++)cout<<tag[i]<<' ';cout<<endl;        flag=1;        return ;    }    tag[sum]=a[now];    dfs(now+1,sum+1);    tag[now]=inf;    if(now-sum+1<=sum&&a[now]==tag[now-sum])//情况二,遇到能放到集合B里面的  放或者不放。    {        dfs(now+1,sum);    }}int main(){    int t;    cin>>t;    while(t--)    {        flag=0;        memset(a,0,sizeof(a));        cin>>n;        for(int i=0;i<n;i++)            cin>>a[i];        for(int i=0;i<n;i++)            tag[i]=inf;        dfs(0,0);        if(flag==1)printf("Good job!!\n");        else printf("What a pity!\n");    }}



0 0
原创粉丝点击