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
- HDU 4876 ZCC loves cards
- HDU-4876-ZCC loves cards
- hdu 4876 ZCC loves cards
- HDU 4876 ZCC loves cards
- HDU 4876 ZCC loves cards
- 【HDU 4876多校】ZCC loves cards【搜索】
- hdu 4876 ZCC loves cards(暴力)
- HDU 4876 ZCC loves cards(暴力剪枝)
- 【HDU】4876 ZCC loves cards 暴力
- hdu 4876 ZCC loves cards (搜索+剪枝)
- HDOJ 4876 ZCC loves cards
- hdu 4876 ZCC loves cards(暴力+剪枝)
- hdu 4876 ZCC loves cards(暴搜+剪枝)
- HDU 4876 ZCC loves cards【暴力+深搜+剪枝】
- [HDOJ 4876] ZCC loves cards [搜索]
- HDOJ 4876 ZCC loves cards(搜索)
- HDU4876 ZCC loves cards
- HDU4876:ZCC loves cards
- cocos2d-x 坐标转换总结
- IOS总结_IOS7.0以后改变状态栏字体颜的问题
- jQuery_review之table根据内容分组进行折叠显示以及,折叠之后高亮显示的实现
- java多线程 sleep()和wait()的区别
- 判断点是否在三角形内部
- HDU-4876-ZCC loves cards
- Java线程中sleep和wait的区别详细介绍
- uva 10615 二部图 【???】!!!!!!!!!!!!!!!!!!!!!!!!!!
- Servlet学习(2)
- JNI访问SD卡文件
- hdu 2612
- Uva 540 Team Queue
- java5中的集合类 ---- Map
- 轻松一刻