HDU-4876-ZCC loves cards

来源:互联网 发布:数据库服务器价格 编辑:程序博客网 时间:2024/05/16 10:07

这个题就是搜索吧,当时忽略了k<=6这个条件,想复杂了。然后后面写了的又把后面特判k>n的位置放错,导致一直TLE,用了STL和DFS进行全排列

代码:

DFS全排列:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=25;int n,k,l,ans,a[maxn],b[maxn],s[maxn];bool vis[210],se[maxn];int cmp(int a,int b){    return a>b;}void dfs1(int cnt){    if(cnt==k)    {        memset(vis,0,sizeof(vis));        for(int i=0;i<k;i++)        {            int val=0;            for(int j=i;j<k+i;j++)            {                val^=s[j%k];                vis[val]=1;            }        }        bool is=false;        for(int i=l;;i++)            if(!vis[i])            {                ans=max(ans,i-1);                break;            }        return;    }    for(int i=0;i<k;i++)        if(!se[i])        {            se[i]=1;            s[cnt]=b[i];            dfs1(cnt+1);            se[i]=0;        }}void dfs(int index,int val){    if(val)        vis[val]=1;    if(index==k)        return;    dfs(index+1,val^b[index]);    dfs(index+1,val);}void DFS(int index,int cnt){    if(cnt==k)    {        memset(vis,0,sizeof(vis));        dfs(0,0);        for(int i=l;i<=max(l,ans+1);i++)            if(!vis[i])                return;        dfs1(0);        return;    }    if(index>=n||n-index+cnt<k)        return;    b[cnt]=a[index];    DFS(index+1,cnt+1);    DFS(index+1,cnt);}void solve(){    ans=0;    DFS(0,0);     printf("%d\n",ans);}int main(){    while(scanf("%d%d%d",&n,&k,&l)!=EOF)    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        if(k>n)        {            printf("0\n");            continue;        }        sort(a,a+n);        solve();    }    return 0;}

STL全排列:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=25;int n,k,l,ans,a[maxn],b[maxn],s[maxn];bool vis[210],se[maxn];void dfs(int index,int val){    vis[val]=1;    if(index==k)        return;    dfs(index+1,val^b[index]);    dfs(index+1,val);}void DFS(int index,int cnt){    if(cnt==k)    {        memset(vis,0,sizeof(vis));        dfs(0,0);        for(int i=l;i<=ans+1;i++)            if(!vis[i])                return;        for(int i=0;i<k;i++)            s[i]=b[i];        do{            memset(vis,0,sizeof(vis));            for(int i=0;i<k;i++)             {                  int val=0;                  for(int j=i;j<k+i;j++)                {                      val^=s[j%k];                      vis[val]=1;                  }              }              for(int i=l;i<=l+k*k;i++)                  if(!vis[i])                {                      ans=max(ans,i-1);                      break;                  }        }while(next_permutation(s+1,s+k));        return;    }    for(int i=index;i<n;i++)    {        b[cnt]=a[i];        DFS(i+1,cnt+1);    }}void solve(){    ans=l-1;    DFS(0,0);     if(ans<l)        printf("0\n");    else        printf("%d\n",ans);}int main(){    while(~scanf("%d%d%d",&n,&k,&l))    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        if(k>n)        {            printf("0\n");            continue;        }        sort(a,a+n);        solve();    }    return 0;}




0 0
原创粉丝点击