回顾二分与bfs(或者说是递推)和简单模拟
今天,阳光正好,适合敲代码,诸事皆宜。
先来两道简单的模拟题。
第一道
机器翻译

输出为5.
代码思路:很明显需要用到队列来存单词,在建立一个bool数组来存储队列中有没有这个单词,需不需要向外界查询,如果需要并且队列可以容下,则加入队列并将bool数组标记在队列中有该单词,如果队列容不下,则将队头弹出,并用bool数组标记弹出的数字在该队列中没有。
代码:
#include<bits/stdc++.h>
using namespace std;
queue<int> ss;
bool mp[];
int n,m;
int main()
{
int i,j,t,ans=;
cin>>m>>n;
for(i=;i<n;i++)
{
cin>>t;
if(ss.size()>m)
{
int f=ss.front();
mp[f]=;
ss.pop();
}
if(mp[t]==)
{
ss.push(t);
ans++;
mp[t]=;
}
}
cout<<ans<<endl;
return ;
}
第二道
神奇的幻方

输出为:
8 1 6
3 5 7
4 9 2
思路:按题中步骤执行即可
首先找到1的位置,他在x=1,y=n/2+1;
然后判断若x在第一行,但不在最后一列,就让下一个数在x=n,y++的位置;
若不在第一行,在最后一列,就让下一个数在x--,y=1的位置;
若在第一行最后一列,就让下一个数在x++,y的位置;
若既不在最后一行也不在最后一列,并且右上方没有数字,则下一个数在x--,y++的位置;
以上四个都不满足就在x++,y的位置;
代码:
#include<bits/stdc++.h>
using namespace std;
int a[][];
int main()
{
int n,i,j,x,y;
cin>>n;
x=;y=n/+;
for(i=;i<=n*n;i++)
{
a[x][y]=i;
if(x==&&y!=n)
{
x=n;y++;
}
else if(y==n&&x!=)
{
y=;x--;
}
else if(x==&&y==n)
{
x++;
}
else if(a[x-][y+]==)
{
x--;y++;
}
else
x++;
}
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return ;
}
一道二分的题
灵能探索
链接:https://ac.nowcoder.com/acm/contest/639/A
来源:牛客网
思路:二分边界是从[灵能的最小值,灵能总和],check()函数的书写:循环数组,累加如果大于等于mid的值,则让con++,s=0,继续循环直到结束。判断con的值是否大于等于题中输入的组数,大于返回1,证明mid的值还可以在大,就让l=mid+1,ans=mid,如果con的值不大于,证明mid的值大了,则需要r=mid-1,在进行判断找出合适的mid的值。
代码:
#include<bits/stdc++.h>
using namespace std;
const long long N=;
long long n,k,ans,a[N];
long long check(long long x)
{
long long i,j,s=,con=;
for(i=;i<n;i++)
{
s+=a[i];
if(s>=x)
{
con++;
s=;
}
}
if(con>=k)
return ;
return ;
}
int main()
{
long long i,j,minx=,sum=;
long long l,r,mid;
cin>>n>>k;
for(i=;i<n;i++)
{
cin>>a[i];
minx=min(minx,a[i]);
sum+=a[i];
}
l=minx;r=sum;
while(l<=r)
{
mid=(l+r)/;
if(check(mid))
{
l=mid+;
ans=mid;
}
else
r=mid-;
}
cout<<ans<<endl;
}
一个乍一看是一道bfs搜索题,然而他却是到递推题。
好心酸。。。。。
过河卒
链接:https://ac.nowcoder.com/acm/contest/639/B
来源:牛客网
先说说bfs的思路:从(1,1)开始搜索,遇到马或者超界就不放入队列里,最后如果队列到达了终点则ans++;
代码:可惜只过了75%的数据
#include<bits/stdc++.h>
using namespace std;
const int mod=;
int n,m,x,y,ans;
int xx[]={,},yy[]={,};
int v[][];
int vis[][];
struct node
{
int a,b;
};
void bfs(int X,int Y)
{
vis[X][Y]=;
node t;
t.a=X;t.b=Y;
queue<node> p;
p.push(t);
while(!p.empty())
{
node g=p.front();
p.pop();
if(g.a==n&&g.b==m)
{
ans++;
continue;
}
for(int i=;i<;i++)
{
int w=g.a+xx[i];
int l=g.b+yy[i];
if(v[w][l]!=&&vis[w][l]!=&&w>=&&w<=n&&l>=&&l<=m)
{
p.push(node{w,l});
}
}
}
return ;
}
int main()
{
int i,j;
cin>>n>>m>>x>>y;
v[x][y]=;
v[x-][y-]=;
v[x-][y-]=;
v[x-][y+]=;
v[x-][y+]=; v[x+][y-]=;
v[x+][y-]=;
v[x+][y+]=;
v[x+][y+]=;
bfs(,);
cout<<ans%mod<<endl;
return ;
}
正解:递推dp[i][j]=dp[i-1][j]+dp[i][j-1]
现将马的所有可去的位置用v[][]的二维数组标记上,然后将表格的第一行和第一列dp[][]赋值为1,如果途中遇到马的位置,则停下结束循环,马下面的将不会走故而可以结束循环,最终用二重循环从(2,2)开始计算如果不是马的位置则dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod,否则dp[i][j]=0;
最终输出dp[n][m]%mod的值,在这里特别声明一定要在计算dp[i][j]的时候也要取mod,因为数字很大容易超限,导致错误。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=;
ll n,m,ans,x,y;
int x1[]={,-,-,,,,,-,-};
int yy[]={,,,,,-,-,-,-};
ll dp[][];
ll v[][];
int main()
{
ll i,j;
cin>>n>>m>>x>>y;
v[x][y]=;
for(i=;i<=;i++)
{
if(x+x1[i]>=&&y+yy[i]>=)
v[x+x1[i]][y+yy[i]]=;
}
for(i=;i<=n;i++)
{
if(v[i][]==)
dp[i][]=;
else
break;
}
for(j=;j<=m;j++)
{
if(v[][j]==)
dp[][j]=;
else
break;
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if(v[i][j]==)
dp[i][j]=(dp[i-][j]+dp[i][j-])%mod;
else
dp[i][j]=;
}
}
cout<<dp[n][m]%mod<<endl;
return ;
}
ACM之旅仍在继续,加油!!少年
回顾二分与bfs(或者说是递推)和简单模拟的更多相关文章
- P1002 过河卒 【递推、简单动规】
题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒 ...
- POJ 2506 Tiling (递推 + 大数加法模拟 )
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7965 Accepted: 3866 Descriptio ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- 02python算法-递推
递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3 ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- PKU 2506 Tiling(递推+高精度||string应用)
题目大意:原题链接有2×1和2×2两种规格的地板,现要拼2×n的形状,共有多少种情况,首先要做这道题目要先对递推有一定的了解.解题思路:1.假设我们已经铺好了2×(n-1)的情形,则要铺到2×n则只能 ...
- 第46套题【STL】【贪心】【递推】【BFS 图】
已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...
- hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4
题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...
随机推荐
- Silverlight消散,WinRT登台
2011年,Silverlight刚开始有蓬勃发展的起色,不利的传言就开始大量流传.不安的Silverlight开发者们要求微软澄清,但得到的只是沉默.终于随着微软在BUILD上亮相Window 8以 ...
- XML转义字符 如"&"
解析数据 XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析,例如: <message>Hello Word!</mes ...
- javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate
1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...
- "犯罪心理"解读Mybatis拦截器
原文链接:"犯罪心理"解读Mybatis拦截器 Mybatis拦截器执行过程解析 文章写过之后,我觉得 "Mybatis 拦截器案件"背后一定还隐藏着某种设计动 ...
- 数据管理工具Flux、Redux、Vuex的区别
目录 为什么要进行数据管理? 怎么有效地进行数据管理? 数据管理工具 1. Flux 2. Redux 3. Vuex 使用数据管理工具的场景 相关资料 主要讲解一下前端为什么需要进行数据管理,有效的 ...
- pc微信浏览器打开页面显示空白,其他浏览器正常
pc微信浏览器不兼容es6的语法糖.
- java源码解析之String类(三)
上一节我们主要讲了String类的一些不是很常用的方法,其中需要掌握的如下,我就不再赘述了 public int length() public boolean isEmpty() public by ...
- 怎么用Hostwinds搭建Wordpress博客网站(超详细图文教程)
Hostwinds 成立于 2010 年,在主机托管行业算是一个比较新的品牌,但是,凭借丰富的产品线.卓越的服务器性能.良好的客户支持,以及低廉实惠的价格,他们受到了广大客户的喜爱,并多次获得行业重要 ...
- Product Backlog:终极任务清单
健康的Product Backlog就像一个健康的人那样:整洁有序.组织合理.公开透明.一个按照优先级顺序排好的敏捷Backlog不仅能够简化发版和迭代计划,还能够对团队计划去做的所有工作进行细致规划 ...
- 另一个ACM之路建议
ACM联系建议 一位高手对我的建议: 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划 ...