今天,阳光正好,适合敲代码,诸事皆宜。

先来两道简单的模拟题。

第一道

机器翻译

输出为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(或者说是递推)和简单模拟的更多相关文章

  1. P1002 过河卒 【递推、简单动规】

    题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒 ...

  2. POJ 2506 Tiling (递推 + 大数加法模拟 )

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7965   Accepted: 3866 Descriptio ...

  3. Chapter1 递归与递推

    Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...

  4. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  5. 02python算法-递推

    递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3 ...

  6. HOJ 2148&POJ 2680(DP递推,加大数运算)

    Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...

  7. PKU 2506 Tiling(递推+高精度||string应用)

    题目大意:原题链接有2×1和2×2两种规格的地板,现要拼2×n的形状,共有多少种情况,首先要做这道题目要先对递推有一定的了解.解题思路:1.假设我们已经铺好了2×(n-1)的情形,则要铺到2×n则只能 ...

  8. 第46套题【STL】【贪心】【递推】【BFS 图】

    已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...

  9. hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4

    题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...

随机推荐

  1. Silverlight消散,WinRT登台

    2011年,Silverlight刚开始有蓬勃发展的起色,不利的传言就开始大量流传.不安的Silverlight开发者们要求微软澄清,但得到的只是沉默.终于随着微软在BUILD上亮相Window 8以 ...

  2. XML转义字符 如"&"

    解析数据 XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析,例如: <message>Hello Word!</mes ...

  3. javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate

    1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...

  4. "犯罪心理"解读Mybatis拦截器

    原文链接:"犯罪心理"解读Mybatis拦截器 Mybatis拦截器执行过程解析 文章写过之后,我觉得 "Mybatis 拦截器案件"背后一定还隐藏着某种设计动 ...

  5. 数据管理工具Flux、Redux、Vuex的区别

    目录 为什么要进行数据管理? 怎么有效地进行数据管理? 数据管理工具 1. Flux 2. Redux 3. Vuex 使用数据管理工具的场景 相关资料 主要讲解一下前端为什么需要进行数据管理,有效的 ...

  6. pc微信浏览器打开页面显示空白,其他浏览器正常

    pc微信浏览器不兼容es6的语法糖.

  7. java源码解析之String类(三)

    上一节我们主要讲了String类的一些不是很常用的方法,其中需要掌握的如下,我就不再赘述了 public int length() public boolean isEmpty() public by ...

  8. 怎么用Hostwinds搭建Wordpress博客网站(超详细图文教程)

    Hostwinds 成立于 2010 年,在主机托管行业算是一个比较新的品牌,但是,凭借丰富的产品线.卓越的服务器性能.良好的客户支持,以及低廉实惠的价格,他们受到了广大客户的喜爱,并多次获得行业重要 ...

  9. Product Backlog:终极任务清单

    健康的Product Backlog就像一个健康的人那样:整洁有序.组织合理.公开透明.一个按照优先级顺序排好的敏捷Backlog不仅能够简化发版和迭代计划,还能够对团队计划去做的所有工作进行细致规划 ...

  10. 另一个ACM之路建议

    ACM联系建议 一位高手对我的建议: 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划 ...