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

先来两道简单的模拟题。

第一道

机器翻译

输出为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. qt截获html请求(继承QNetworkAccessManager和QNetworkReply)

    QtWebkit加载html页面,html中会有很多的请求,比如<img id="testImg" src="http://*.jpg" width=&q ...

  2. 验证码生成器(在TImage.Canvas上写字,很好看)

    生成验证码的方式有很多种,如下则是比较简单的实现,且运用了正余弦曲线来扭曲验证码字符. unit AuthenticodeGenerate; interface uses SysUtils, Wind ...

  3. U盘免疫

    界面如下: 关键部分代码如下: void CImmunityUDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 TCHAR szPath[MAX ...

  4. C++ 王者归来:对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)

    Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...

  5. vuejs切换导航条高亮路由高亮做法

    我的GitHub前端经验总结,喜欢的话请点star✨✨Thanks.:https://github.com/liangfengbo/frontend-develop vuejs导航条高亮我的做法: 用 ...

  6. SpringCloud Sleuth入门介绍

    案例代码:https://github.com/q279583842q/springcloud-e-book 一.Sleuth介绍   为什么要使用微服务跟踪?它解决了什么问题? 1.微服务的现状? ...

  7. Mybatis_three

    延迟加载 实现多对一的延迟加载(association) 例如下面的:有很多个账户信息(招商\工商\农商)是属于一个用户人的 [需求] 查询账户(Account)信息并且关联查询用户(User)信息. ...

  8. spring 5.x 系列第18篇 —— 整合websocket (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 项目模拟一个简单的群聊功能,为区分不同的聊 ...

  9. Mui a 链接失效的解决办法

    方法一: mui('body').on('tap', 'a', function() { if(this.href){   //判断链接是否存在 location.href = this.href; ...

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

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