P2678 跳石头

【题目背景】

一年一度的“跳石头”比赛又要开始了!

【题目描述】

这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点。

为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石)。

【输入输出格式】

输入格式:

输入文件名为 stone.in。

输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终 点之间的岩石数,以及组委会至多移走的岩石数。

接下来 N 行,每行一个整数,第 i 行的整数 Di(0 < Di < L)表示第 i 块岩石与 起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同 一个位置。

输出格式:

输出文件名为 stone.out。 输出文件只包含一个整数,即最短跳跃距离的最大值。

【输入输出样例】

输入样例#1:

25 5 2
2
11
14
17
21
输出样例#1:

4

输入输出样例 1 说明:将与起点距离为 2 和 14 的两个岩石移走后,最短的跳跃距离为 4(从与起点距离 17 的岩石跳到距离 21 的岩石,或者从距离 21 的岩石跳到终点)。

另:对于 20%的数据,0 ≤ M ≤ N ≤ 10。 对于50%的数据,0 ≤ M ≤ N ≤ 100。

对于 100%的数据,0 ≤ M ≤ N ≤ 50,000,1 ≤ L ≤ 1,000,000,000。

#include<iostream>
using namespace std;
#define LL long long
LL N,M,L,ans,a[];
bool chack(int x){
int sum=,last=;
for(int i=;i<=N;i++){
if(a[i]-last<x)sum++;
else last=a[i];
if(sum>M)return false;
}
return true;
}
int main(){
cin>>L>>N>>M;
for(int i=;i<=N;i++)cin>>a[i];a[++N]=L;
int l=,r=L;
while(l<=r){
int mid=(l+r)>>;
if(chack(mid))ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
}

100分 二分答案

P2679 子串

【题目背景】

【题目描述】

有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案。

【输入输出格式】

输入格式:

输入文件名为 substring.in。

第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长度,以及问

题描述中所提到的 k,每两个整数之间用一个空格隔开。 第二行包含一个长度为 n 的字符串,表示字符串 A。 第三行包含一个长度为 m 的字符串,表示字符串 B。

输出格式:

输出文件名为 substring.out。 输出共一行,包含一个整数,表示所求方案数。由于答案可能很大,所以这里要求[b]输出答案对 1,000,000,007 取模的结果。[/b]

【输入输出样例】

输入样例#1:

6 3 1
aabaab
aab
输出样例#1:

2
输入样例#2:

6 3 2
aabaab
aab
输出样例#2:

7
输入样例#3:

6 3 3
aabaab
aab
输出样例#3:

7

对于第 1 组数据:1≤n≤500,1≤m≤50,k=1;

对于第 2 组至第 3 组数据:1≤n≤500,1≤m≤50,k=2; 对于第 4 组至第 5 组数据:1≤n≤500,1≤m≤50,k=m; 对于第 1 组至第 7 组数据:1≤n≤500,1≤m≤50,1≤k≤m; 对于第 1 组至第 9 组数据:1≤n≤1000,1≤m≤100,1≤k≤m; 对于所有 10 组数据:1≤n≤1000,1≤m≤200,1≤k≤m。

/*
很明显,这是一道dp题,然后来想想怎么表示状态,对答案有影响的就是A串的第i个字符,B串的第j个字符,和k个子串,简单来说就是和选取的字符和子串的数量有关.那么设f[i][j][kk]表示在A串的前i个字符中选kk个子串匹配B串的前j个字符的方案数.求方案数可以采用加法原理,考虑A串的第i个字符,那么这个字符的决策只有取或不取,很明显,加法原理,把不取的方案数和取的方案数加起来就可以,但是状态的定义并不能看出这个字符到底取不取,或者说并不能推出结果来,怎么办呢?
那么就用一个数组s[i][j][kk]来表示在A串的前i个字符中选kk个子串匹配B串的前j个字符的方案数,A串的第i个字符会被取到.那么这个s数组该怎么推出来呢?可以发现,如果取第i个字符也有2种可能,因为kk是一定的,第i个字符可能和第i-1个字符合并成一个子串,那么从s[i-1][j][kk]转移过来,也可能不和第i-1个字符合并成一个子串,那么就要新开一个子串,故kk一定从kk-1转移过来,根据加法原理,那么s[i][j][kk] = s[i-1][j-1][kk] + f[i-1][j-1][kk-1].
还有一个问题,f数组该怎么推呢?根据之前分析的,把不取和取的加上来即可,即f[i][j][kk] = s[i][j][kk] + f[i-1][j][kk],其实可以发现,f数组就相当于前缀和数组.
还有一个问题:这是一个三维的状态转移方程!空间不一定开的下,再看数据范围,这绝对MLE,怎么办?注意到i只能从i或i-1转移过来,可以想到滚动数组,滚动数组有一个比较好些的写法就是把第一维全部加上&1,或者干脆弄两个变量处理完一组数据就交换即可.
*/
#include<iostream>
#include<cstdio>
#define mod 1000000007
using namespace std;
int len1,len2,f[][][],s[][][],n;
char s1[],s2[];
int main(){
scanf("%d%d%d%s%s",&len1,&len2,&n,s1+,s2+);
f[][][]=;
for(int i=;i<=len1;i++){
f[i&][][]=;
for(int j=;j<=len2;j++){
for(int k=;k<=n;k++){
if(s1[i]==s2[j])
s[i&][j][k]=(s[(i-)&][j-][k]+f[(i-)&][j-][k-])%mod;
else
s[i&][j][k]=;
f[i&][j][k]=(f[(i-)&][j][k]+s[i&][j][k])%mod;
}
}
}
printf("%d",f[len1&][len2][n]);
}

100分 字符串dp

P2680 运输计划

【题目背景】

公元 2044 年,人类进入了宇宙纪元。

【题目描述】

L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。

小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物

流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。

为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。

如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少?

【输入输出格式】

输入格式:

输入文件名为 transport.in。

第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。

接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第

i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。

接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j个 运输计划是从 uj 号星球飞往 vj 号星球。

输出格式:

输出 共1行,包含1个整数,表示小P的物流公司完成阶段性工作所需要的最短时间。

【输入输出样例】

输入样例#1:

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
输出样例#1:

11

所有测试数据的范围和特点如下表所示

请注意常数因子带来的程序效率上的影响。

最新文章

  1. Wordpress如何开启用户注册功能
  2. Hadoop建立IPC连接和数据读写
  3. OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)
  4. Oracle statspack 安装及使用
  5. SQL-Server索引漫谈
  6. c++重点知识点
  7. 转:PHP include()和require()方法的区别
  8. &amp;lt;&amp;lt;Python基础课程&amp;gt;&amp;gt;学习笔记 | 文章13章 | 数据库支持
  9. The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
  10. Swift 是猴还是猿?
  11. [学习OpenCV攻略][012][读取、修改、保存图像]
  12. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
  13. Ambiguous handler methods mapped for HTTP
  14. MPD软件工作坊北京站:技术创新与研发效率带来的前沿思考
  15. ZOJ 4053 Couleur
  16. 如何导入外部Git仓库到中国源代码托管平台(Git@OSC)
  17. 网络编程基础——System.Net.Socket 命名空间及相关类的使用
  18. /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of&lt;std::_Mem_fn&lt;void
  19. Linux中shell变量$0,$?等含义
  20. Python 循环删除指定文件夹下所有的.longtian类型文件

热门文章

  1. 【zabbix】Windows服务器获取IIS站点以及程序池状态
  2. angularJs 购物车模型
  3. PermissionError: [Errno 13] Permission denied:
  4. 深刻理解render 和 redirect_to
  5. 使用wepy 小程序授权点击取消授权失败的方案
  6. Contiki 2.7 Makefile 文件(三)
  7. haproxysocket 参数记录
  8. Python成长之路第一篇(2)__初识列表和元组
  9. 创建Django博客的数据库模型
  10. 引用 qsort与sort的比较