hdu 4620 多校第二场 搜索

来源:互联网 发布:百无一用是书生知乎 编辑:程序博客网 时间:2024/05/23 15:23

直接水过,太挫了……关键是一开始读不懂题


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;struct P{    int C,T,idx;    int f[15];}obj[40];bool cmp(P l,P r){    return l.T<r.T;}int ans[40],ans_cnt,now[40],vis[205];int n,M,W;void dfs(int pos,int last_cut,int cnt){    if(cnt>ans_cnt)    {        ans_cnt=cnt;        for(int i=0;i<cnt;++i)            ans[i]=now[i];    }    if(pos==n+1 || cnt+n-pos+1<ans_cnt)        return;    if(last_cut>=0 && obj[pos].T-last_cut>W)        return;    dfs(pos+1,last_cut,cnt);    int nn=0;int ff[12];    for(int i=1;i<=obj[pos].C;++i)        if(!vis[obj[pos].f[i]]){        ff[nn++]=obj[pos].f[i];}    if(nn<3)        return;    for(int i=0;i<nn;++i)vis[ff[i]]=1;    now[cnt]=obj[pos].idx;    dfs(pos+1,obj[pos].T,cnt+1);    for(int i=0;i<nn;++i)vis[ff[i]]=0;}int cc,tt,ff[40];int main (){    int ncase;    scanf("%d",&ncase);    while(ncase--)    {        scanf("%d%d%d",&n,&M,&W);        for(int i=1;i<=n;++i)        {            scanf("%d%d",&cc,&tt);            for(int j=1;j<=cc;++j)                scanf("%d",&ff[j]);            obj[i].C=cc;obj[i].T=tt;obj[i].idx=i;            for(int j=1;j<=cc;++j)                obj[i].f[j]=ff[j];            /*scanf("%d%d",&(obj[i].C),&(obj[i].T));            for(int j=1;j<=obj[i].C;++j)                scanf("%d",&(obj[i].f[j]));*/        }        sort(obj+1,obj+1+n,cmp);        ans_cnt=0;        memset(vis,0,sizeof(vis));        dfs(1,-1,0);        printf("%d\n",ans_cnt);sort(ans,ans+ans_cnt);        for(int i=0;i<ans_cnt;++i)        {            printf("%d",ans[i]);            if(i<ans_cnt-1)                printf(" ");            else printf("\n");        }    }    return 0;}


原创粉丝点击