P1506 拯救oibh总部
题目链接
0是土地 *是墙 洪水从四面八方过来 求未被淹没的土地数量
扫一下边缘一圈,为0可以dfs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| char c[505][505]; int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1}; void dfs(int x,int y){ if(c[x][y]=='*')return; c[x][y]='-'; for(int i=1;i<=4;i++){ int xx=x+dx[i],yy=y+dy[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m){ dfs(xx,yy); } } } int n,m; int ans; for(int i=1;i<=n;i++)dfs(i,1),dfs(i,m); for(int i=1;i<=m;i++)dfs(1,i),dfs(n,i); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ans+=c[i][j]=='0'?1:0; } }
|
B3626 跳跃机器人
题目链接
dp[i]=min(dp[i],dp[i-1]+1);
如果未到右边界才可由dp[i+1]+1转移
为偶数可由dp[i/2]+1转移
奇数可由dp[(i-1)/2]+2转移
如果未到右边界才可由dp[(i+1)/2]+2转移
1 2 3 4 5 6 7 8 9 10 11 12 13
| int dp[1000005]; for(int i=2;i<=n+1;i++)dp[i]=n; dp[1]=0; for(int i=2;i<=n;i++){ dp[i]=min(dp[i],dp[i-1]+1); if(i!=n)dp[i]=min(dp[i],dp[i+1]+1); if(i%2==0)dp[i]=min(dp[i],dp[i/2]+1); else{ dp[i]=min(dp[i],dp[(i-1)/2]+1); if(i!=n)dp[i]=min(dp[i],dp[(i+1)/2]+1); } } cout<<dp[n];
|
P2037 电话号码
题目链接
STL模拟问题 set去重+排序 unordered_map映射个数
N<=100000 且 电话号码长度不会超过1000
O(N)*(1000)==1e9可过
1 2 3 4 5 6 7 8 9 10 11 12 13
| void solve(string s){ for(int i=0;i<s.szie();i++){ if(s[i]>='A'&&s[i]<='Z')s[i]=...; } string ss=''; for(auto i:s){ ss+=i; if(ss.size()==3)ss+='-'; } set.insert(ss); mp[ss]++; }
|
P6183 [USACO10MAR] The Rock Game S
题目链接
将状态作为N位二进制表示0就是O 1就是X
求出一种方案使得相邻两种状态恰好有一位不同且无重复状态出现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int vis[1<<15+5]; bool dfs(int e){ if(!vis[e]){ for(int i=n-1;i>=0;i++){ int t=e&(1<<i); if(t)cout<<'X'; else cout<<'O'; } vis[e]=1; for(int i=0;i<=n-1;i++){ if(dfs(x^(1<<i))) return true; } return true; } return false; } dfs(0);
|