HDU-4876-ZCC loves cards
2014-07-26 14:01
489 查看
这个题就是搜索吧,当时忽略了k<=6这个条件,想复杂了。然后后面写了的又把后面特判k>n的位置放错,导致一直TLE,用了STL和DFS进行全排列
代码:
DFS全排列:
STL全排列:
代码:
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; }
相关文章推荐
- HDu 4876(2014多校第二场 ZCC loves cards)
- hdu 4876 ZCC loves cards(暴力+剪枝)
- hdu 4876 ZCC loves cards(暴力)
- hdu 4876 ZCC loves cards 2014 Multi-University Training Contest 2
- 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【暴力+深搜+剪枝】
- HDU 4876 ZCC loves cards (2014多校联合训练第二场1005) 解题报告(暴力+剪枝)
- 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(搜索)