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

先来两道简单的模拟题。

第一道

机器翻译

输出为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. QThread多线程编程经典案例分析(三种方法,解释了为什么使用moveToThread的根本原因,即为了避免调用QThread::exec() )

    传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...

  2. QList使用下标[index]才可以获得可修改的item的引用(估计QStringList也是如此)

    QList算是最常用的集合了,今儿偶然间需要修改QList中的值,结果郁闷了.QList中提供了replace函数来替换item,但不是修改.而at().value()操作均返回的是const的ite ...

  3. python发送邮件554DT:SPM已解决

    说明:本例使用163邮箱 一.报错信息 使用SMTP发送邮件遇到以下报错: 554, b'DT:SPM 163 smtp10,DsCowACXeOtmjRRdsY8aCw--.21947S2 1561 ...

  4. Java---使用EWS 写个ExchangeMailUtil

    依赖包: commons-httpclient-3.1.jar commons-codec-1.10.jar commons-logging-1.2.jar jcifs-1.3.17.jar 代码示例 ...

  5. 开源joda-time使用demo

    开源joda-time 1.maven中引入 <dependency> <groupId>joda-time</groupId> <artifactId> ...

  6. RT-thread线程创建:动态线程与静态线程

    本文介绍了如何创建一个动态线程和一个静态线程 RT-thread版本:RT-thread system 3.1.0 开发环境:MDK5 为了编程方便,创建了sample1.c文件,然后添加到工程中 话 ...

  7. Linux下无法执行tree命令问题

    Linux下不能使用tree命令,是因为没有安装命令, 执行下面代码就行了 yum install tree -y

  8. ElasticSearch 常用 curl 命令

    1. 集群支持的选项 curl -XGET 'http://10.240.0.8:9200/_cat'  2. 查看节点信息 curl -XGET 'http://10.240.0.8:9200/_ ...

  9. 我是这么学习Selenium元素定位操作的

    写在前面 做web自动化测试都有体会,本质也就是通过操作页面元素对象来模拟用户操作行为,那么首先我们先找到这些元素对象,然后才能进行一系列操作. 我们得先告诉自动化工具或者说代码要操作那个元素,毕竟代 ...

  10. Hive入门(二)分区

    1 基本概念 1.1 什么是分区 Hive查询中一般会扫描整个表内容,会消耗很多时间.有时候只需要查询表中的一部分数据,因此建表时引入了partition(分区)概念. 表中的一个 Partition ...