博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
topcoder srm 706 div1
阅读量:6323 次
发布时间:2019-06-22

本文共 3143 字,大约阅读时间需要 10 分钟。

1、给定一个迷宫,点号表示不可行,井号表示可行。现在可以改变其中的一些井号的位置。问最少改变多少个井号可以使得从左上角到右下角存在路径。

思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m-1$则无解。否则最多改变$n+m-1$个井号即可。令$f[x][y][k]$表示现在到达位置$(x,y)$且中途经过的点号格子数为$k$时最少经过了多少井号格子。这样进行搜索即可。搜过过程中,应该满足$k\leq n+m-1$且$k+f[x][y][k]\leq S$。

#include 
#include
#include
#include
#include
#include
using namespace std;const int N=20;int f[N][N][N+N];int inq[N][N][N+N];int h[N][N][N+N];const int dx[]={0,0,1,-1};const int dy[]={1,-1,0,0};struct node{ int x,y,p; node(){} node(int _x,int _y,int _p): x(_x),y(_y),p(_p) {}};queue
Q;void add(int x,int y,int p,int c){ if(!h[x][y][p]||f[x][y][p]>c) { h[x][y][p]=1; f[x][y][p]=c; if(!inq[x][y][p]) { inq[x][y][p]=1; Q.push(node(x,y,p)); } }}class MovingCandies{public: int minMoved(const vector
t) { const int n=(int)t.size(); const int m=(int)t[0].size(); int S=0; for(int i=0;i
=0&&xx
=0&&yy
n+m-1||pp+cc>S) continue; add(xx,yy,pp,cc); } } } for(int i=0;i<=n+m-1;++i) { if(h[n-1][m-1][i]) return i; } return -1; }};

  

2、给定一个整数数组,每个数字可以被替换成字符ABC中的一个,相同的数组必须被相同的字符替换。问在被任意替换得到的所有不同的字符串中,包含子列ABC的串有多少个。

思路:一个简单的思路是分别枚举第一个A、第一个B、第一个C出现的位置,这样整个串被分成4部分,第一部分中不能出现A,第二部分不能出现B,第三部分不能出现C。这样复杂度是$O(N^{3})$。现在只枚举第一个A第一个B,然后后面字符任意的总数为$X$,不包含C的总数为$Y$,那么此次枚举对答案的贡献为$X-Y$。这样是$O(N^{2})$的复杂度。实现如代码所示。其中$f[i][j]=0$表示数字$i$可以被替换成字符$j$,$j=0$表示A,$j=1$表示B,$j=2$表示C。$tot[j]$表示有多少种数字有$j$种替换方式。

#include 
#include
#include
using namespace std;const int mod=1000000007;const int N=3005;int p[4][N];int tot[4];int f[N][4];int appears[N];class MappingABC{ void init() { for(int i=0;i<4;++i) { p[i][0]=1; for(int j=1;j
t) { const int n=(int)t.size(); for(int i=0;i

 

3、构造一个长度为n的数组$A$,使得$A_{i}$和$A_{j}$互质当且仅当$|i-j|=1$。n不大于500。数组中每个数字大于1小于等于$10^{18}$。

思路:我看到的第一种思路是随机。比如有32个素数,$A$中的每个数字由11位素数构成,每次随机选取11个,判断是否可行。第二种思路如下代码所示。假设当前长度$N=2^{k}$,那么每次处理前,前$N/4$的数字是符合要求的。处理之后前$N/2$是符合要求的。为方便说明,假设整个$N$分为四段,$A,B,C,D$,一开始$A$符合要求。且$A$中的奇数位置跟 $B$的偶数位置满足不互质,$A$中的偶数位置跟 $B$的奇数位置满足不互质。那么只要处理使得$A$中的奇数位置跟 $B$的奇数位置满足不互质,$A$中的偶数位置跟 $B$的偶数位置满足不互质即可。

#include 
#include
#include
using namespace std;int check(int x){ for(int i=2;i*i<=x;++i) if(x%i==0) return 0; return 1;}vector
prime;int id;void init(){ for(int i=2;i<100;++i) if(check(i)) prime.push_back(i);}long long a[1024];void add(int i,int t){ a[i]*=t;}class CoprimeNeighbors{public: vector
findAny(int n) { init(); for(int i=0;i<4;++i) a[i]=1; int N=8; while(N/4
>1; const int M=d-1; for(int i=0;i<=M;++i) a[i+d]=a[i]; const int p=prime[id++]; const int q=prime[id++]; const int LM=M>>1; for(int i=0;i<=LM;i+=2) add(i,p),add(i+d,q); for(int i=LM+2;i<=M;i+=2) add(i,p),add(i+d,q); for(int i=1;i<=LM;i+=2) add(i,q),add(i+d,p); for(int i=LM+3;i<=M;i+=2) add(i,q),add(i+d,p); N<<=1; } const int p=prime[id++]; const int q=prime[id++]; for(int i=0;i
ans; for(int i=0;i

  

转载于:https://www.cnblogs.com/jianglangcaijin/p/6511323.html

你可能感兴趣的文章
普通身份运行Tomcat
查看>>
国内五大抗DDoS服务
查看>>
webpack搭建服务器,随时修改刷新
查看>>
两人五子棋
查看>>
我的友情链接
查看>>
[深入理解文件系统之九] Linux 中页高速缓存的实现
查看>>
百度网盘
查看>>
Redis杂记
查看>>
局域网那些有趣的命令(未完待续)
查看>>
zabbix监控windows linux主机 agent的安装方式
查看>>
netapp学习(四)---创建aggregate
查看>>
ubuntu安装ssh
查看>>
SQLite数据库中存取图片文件
查看>>
用两台服务器配置moosefs
查看>>
2012.11.10项目经理考试核心关注点1_《系统集成项目管理工程师软考辅导——3年真题透解与全真模拟》...
查看>>
JSP的特点和其它动态网页开发技术比较
查看>>
AutoDispose解决RxJava内存泄漏
查看>>
shell脚本常用脚本:for循环
查看>>
不变类
查看>>
ubuntu下adsl拨号设置
查看>>