acm_Sequence one

来源:互联网 发布:php 响应时间设置 编辑:程序博客网 时间:2024/06/06 16:43

题目:

Problem Description
Search is important in the acm algorithm. When you want to solve a problem by using the search method, try to cut is very important.<br>Now give you a number sequence, include n (&lt;=1000) integers, each integer not bigger than 2^31, you want to find the first P subsequences that is not decrease (if total subsequence W is smaller than P, than just give the first W subsequences). The order of subsequences is that: first order the length of the subsequence. Second order the sequence of each integer’s position in the initial sequence. For example initial sequence 1 3 2 the total legal subsequences is 5. According to order is {1}; {3}; {2}; {1,3}; {1,2}. {1,3} is first than {1,2} because the sequence of each integer’s position in the initial sequence are {1,2} and {1,3}. {1,2} is smaller than {1,3}. If you also can not understand , please see the sample carefully. <br>
 

Input
The input contains multiple test cases.<br>Each test case include, first two integers n, P. (1<n<=1000, 1<p<=10000). <br>
 

Output
For each test case output the sequences according to the problem description. And at the end of each case follow a empty line.
 

Sample Input
3 5<br>1 3 2<br>3 6<br>1 3 2<br>4 100<br>1 2 3 2<br>
 

Sample Output
1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>2<br>3<br>1 2<br>1 3<br>2 3<br>2 2<br>1 2 3<br>1 2 2<br><br><br><div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint : You must make sure each subsequence in the subsequences is unique.</div>
 

题意:给你N个数,基本上有点求它的子集的感觉,因为他不能重复。。


想法:深搜加剪枝即可。。


代码:

#include<iostream>  
#include<cstring>  
using namespace std;  
int d[1009];  
int n,p;
int l,c;
struct name  
{  
    int now,pos;
};  
name w[10009];  
bool flag;
bool check(int s,int e)  
{  
    for(int i=s+1;i<e;i++)  
    {  
        if(d[i]==d[e])  
        return false;  
    }  
    return true;  
}  
void set(int length)  
{  
    for(int i=0;i<length-1;i++)  
    cout<<w[i].now<<" ";  
    cout<<w[length-1].now<<endl;
}  
void dfs(int dep,int pos)  
{  
    if(c>=p)
    return;  
    if(dep==l)
    {  
        c++;
        flag=true;  
        set(l);  
        return;  
    }
    for(int i=pos;i<n;i++)  
    {
        if((dep!=0&&w[dep-1].now<=d[i])||dep==0)  
        { 
            if(dep==0&&!check(-1,i))
                continue;  
            if(dep!=0&&!check(w[dep-1].pos,i))  
                continue;  
            w[dep].now=d[i];  
            w[dep].pos=i;  
            dfs(dep+1,i+1);  
        }  
    }  
    return;  
}  
int main()  
{  
    int i;
    while(cin>>n>>p)  
    {  
        for(i=0;i<n;i++)  
        cin>>d[i];  
        c=0;  
        for(i=1;i<n;i++)  
        {  
            flag=false;  
            l=i;  
            dfs(0,0);  
            if(c>=p||!flag)  
            break;  
        }  
        cout<<endl;  
    }  
    return 0;  
}


感想:好难。。

0 0
原创粉丝点击