|
悲伤的故事,数组开小了,然而却显示WA
|
|
莫队搞不过啊qaq无限tle...
|
|
还有无解情况... 对不起人民
题目 2472 口袋的天空
2016-09-25 18:48:49
|
|
|
|
明明理论复杂度最低的算法+各种卡常都过不去,打表都是垃圾出题人逼我的
|
|
还有无解情况... 对不起人民
题目 2472 口袋的天空
2016-09-25 17:43:00
|
|
迟来的Alboi
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 17:39:48
|
|
百年一遇被卡输出流
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 16:14:50
|
|
抛去所有不可能的,剩下的无论多么不可相信,但那就是真相。---Sherlock Holmes
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 16:13:43
|
|
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 16:07:47
|
|
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:57:03
|
|
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:54:10
|
|
说好的N==K呢
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:50:05
|
|
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:49:57
|
|
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:37:12
|
|
抛去所有不可能的,剩下的无论多么不可相信,但那就是真相。
题目 2475 [HZOI 2016]奇偶游戏
2016-09-25 15:35:41
|
|
#include<cstdio>
#include<iostream> #include<algorithm> #include<queue> using namespace std; int ans[2<<16]; int n; int vis[2<<16],sum=1; bool flag; int calc(int x) { int cnt=0; while(x) { if(x&1) cnt++; x=x>>1; } return cnt; } void dfs(int now,int step) { if(now==0&&step>1&&step<sum+1) //加个剪枝瞬间就过了 return; if(now==0&&step==sum+1){ flag=1; for(int i=1;i<=step;i++){ for(int j=1;j<=n;j++) if(ans[i]&(1<<(j-1)))printf("X"); else printf("O"); printf("\n"); } return; } if(step+calc(now)>sum+1) return; for(int i=1;i<=n;i++) { int nx=now^(1<<(i-1)); if(nx!=0&&vis[nx])continue; if(nx==0&&vis[nx]==1){ vis[nx]=2,ans[step+1]=nx; dfs(nx,step+1); ans[step+1]=0,vis[nx]=1; if(flag)return; } else if(nx!=0&&vis[nx]==0){ vis[nx]=1,ans[step+1]=nx; dfs(nx,step+1); ans[step+1]=0,vis[nx]=0; if(flag)return; } else continue; } } int main() { freopen("rocksa.in","r",stdin); freopen("rocksa.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++)sum=sum*2; ans[1]=0,vis[0]=1; dfs(0,1); return 0; } |
|
回复 @Satoshi : 神思路,赞一个!
|
|
感想如下:
这是一道比较简单的题,略微使用一些简单的技巧就可以实现,但我也有不少收获: 1.如果超时了,试试把printf这样的调试语句注释掉!这种无效IO会大大拖累程序运行! 2.这题我其实是运用了二次不等式的思想,逐一计算每一天的钱数,当然我相信大家一定会有更好的解法,我在这里就公开源码,供大家借鉴。 谢谢大家! |
|
每次都是彩色报错,数组开了5000000就神奇地A了,果然什么都得靠评测机
![]() |