8-31测试总结

一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选

择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点。

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

输入

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

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

输出

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

样例输入

25 5 2
2
11
14
17
21

样例输出

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>
#include<cstdio>
#include<algorithm>
using namespace std;
int L,n,m,pos[50005];
bool check(int x)
{
    int sum=0,len=0;
    for(int i=1;i<=n;i++)
    if(pos[i]-pos[i-1]+len<x)
    {
        sum++;
        len+=pos[i]-pos[i-1];
    }else len=0;
    if(L-pos[n]+len<x)
    {
        sum++;
    }
    return sum<=m;
}
int main()
{
    scanf("%d %d %d",&L,&n,&m);
    for(int i=1;i<=n;i++)
    scanf("%d",&pos[i]);
    int l=1,r=L;
    while(l<r)
    {
        //cout<<l<<‘ ‘<<r<<endl;
        int mid=(l+r+1)>>1;
        if(check(mid)) l=mid;else r=mid-1;
        //cout<<l<<‘ ‘<<r<<‘ ‘<<mid<<endl;
    }
    cout<<l<<endl;
} 

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

输入

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

输出

输出共一行,包含一个整数,表示所求方案数。由于答案可能很大,所以这里要求输出答案对 1,000,000,007 取模的结果。

样例输入

6 3 1
aabaab
aab

6 3 2
aabaab
aab

样例输出

2

7
这题DP比较好想吧,f[i][j][k][l]表示第1个字符串取前i个,第2个字符串取前j个,分成k个集合,且最后几位是否连续取的方案数,转移见代码。第i维滚动
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mo 1000000007
int n,m,k,st,prematched;
char stra[1010],strb[1010];
int f[2][1010][210][2];
int main()
{
    scanf("%d %d %d",&n,&m,&k);
    scanf("%s",stra+1);
    scanf("%s",strb+1);
    st=0;
    for(int i=1;i<=n;i++)
    {
        st=1^st;
        memset(f[st],0,sizeof(f[st]));
        f[st][1][1][0] = prematched;
        if (stra[i]==strb[1]) {
            f[st][1][1][1] = 1;
            prematched++;
        }
        for (int j=2;j<=m;j++) {
            for (int t=1;t<=k; t++) {
                if (stra[i]==strb[j]) {
                f[st][j][t][1] =
                ((f[st^1][j-1][t-1][1] + f[st^1][j-1][t-1][0])%mo+f[st^1][j-1][t][1])%mo;
                }
                f[st][j][t][0]=(f[st^1][j][t][0]+f[st^1][j][t][1]) % mo;
            }
        }
    }
    printf("%d\n",(f[st][m][k][1]+f[st][m][k][0])%mo);
} 

公元 2044 年,人类进入了宇宙纪元。
L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1

航道连通了 L 国的所有星球。
小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物
流飞船需要从 ui
号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之
间不会产生任何干扰。
为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P
把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。
在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m
个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。
如果小 P
可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少?

输入

第一行包括两个正整数 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 的物流公司完成阶段性工作所需要的最短时间。

样例输入

6 3
1 2 3
1 6 4
3 1 7
4 3 6
3 5 5
3 6
2 5
4 5
这道题拿到觉得树链剖分裸体,不过貌似要列点把边权转化为点权,不会。于是华丽丽的打了n^2的暴力,结果把%d打成了%lld,运行错误。其实二分+树上差分+lca就可以吧,二分时间,把大于这时间的点对(询问中的)都存下来,然后找它们之间公共的最长边,试着把它变为0,看余下的最长边是否超过枚举的时间值。树上差分证明百度吧,tmp[u]++,tmp[v]++,tmp[lca(u,v)]-=2;update一下。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 300005
#include<vector>
using namespace std;
int head[maxn],to[maxn<<1],next[maxn<<1],val[maxn<<1],dis[maxn],num,ans[maxn],rep[maxn],tmp[maxn],ancestor[maxn],dis_to_fa[maxn];
int n,m;
bool color[maxn],flag[maxn];
struct que{
    int id,v;
};
struct note{
    int u,v;
}edge[maxn];
vector<que> ques[maxn];
int getrep(int u)
{
    if(u==rep[u]) return u;
    return rep[u]=getrep(rep[u]);
}
void make_way(int u,int v,int c)
{
    to[++num]=v;
    next[num]=head[u];
    val[num]=c;
    head[u]=num;
}
void tarjan(int u)
{
    flag[u]=1;
    color[u]=1;
    for(int edge=head[u];edge;edge=next[edge])
    {
        int v=to[edge];
        if(!flag[v])
        {
            dis[v]=dis[u]+val[edge];
            tarjan(v);
            rep[v]=u;
        }
    }

    for(int i=0;i<ques[u].size();i++)
    if(color[ques[u][i].v]) ans[ques[u][i].id]=dis[ques[u][i].v]+dis[u]-2*dis[getrep(ques[u][i].v)],ancestor[ques[u][i].id]=getrep(ques[u][i].v);
 }
void init()
{
    for(int i=1;i<=n;i++)
    rep[i]=i;
}
void dfs(int u)
{
    flag[u]=1;
    for(int edge=head[u];edge;edge=next[edge])
    {
        int v=to[edge];
        if(!flag[v])
        {
            dis_to_fa[v]=val[edge];
            dfs(v);
            tmp[u]+=tmp[v];
        }
    }
}
bool check(int x)
{
    memset(tmp,0,sizeof(tmp));
    int Md=0,ed_n=0;
    for(int i=1;i<=m;i++)
    if(ans[i]>x)
    {
        tmp[edge[i].u]++;
        tmp[edge[i].v]++;
        tmp[ancestor[i]]-=2;
        Md=max(Md,ans[i]);
        ed_n++;
    }
    memset(flag,0,sizeof(flag));
    dfs(1);
    int M=0;
    for(int i=1;i<=n;i++)
    if(tmp[i]==ed_n)  M=max(M,dis_to_fa[i]);
    return Md-M<=x;
}
int main()
{
    scanf("%d %d",&n,&m);
    init();
    for(int i=1;i<n;i++)
    {
        int u,v,c;
        scanf("%d %d %d",&u,&v,&c);
        make_way(u,v,c);
        make_way(v,u,c);
    }
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        ques[u].push_back((que){i,v});
        ques[v].push_back((que){i,u});
        edge[i]=(note){u,v};
    }
    tarjan(1);
    int l=0,r;
    for(int i=1;i<=m;i++)
    r=max(r,ans[i]);
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(check(mid))
        r=mid;else l=mid+1;
    }
     cout<<l<<endl;
}
				
时间: 2024-11-11 09:54:56

8-31测试总结的相关文章

程序员学炒股(7) 股指期货收盘价对第二天开盘价有影响吗?

很多微博和文章都说,股指期货的收盘价对第二天开盘价影响很大,因为股指多交易15分钟,因此对股市的第二天开盘价影响非常大,网上有一个文章是这样说的: “股指期货开盘早于股市15分钟,收盘又晚15分钟,国泰君安研究员曾统计,股指期货晚收盘15分钟的涨跌对于次日期指走势的预测准确率达到了70%.” 看看这个文章的作者是江恩艾略特道氏,虽然不知道是啥,但是看着还是很唬人的,再看看这篇文章的访问次数695567次,可见还是有影响力的. 如果这篇文章说的是真的话,能够预测到第二天开盘的大盘也是很不错滴,我们

adb server version (31) doesn’t match this client (36); killing… 的解决方法

今天折腾了一下Android studio,好不容易搞完了,结果在运行adb命令的时候出错了 不要着急,我们先看下这个错误是怎么出现的. 1.搞完Android studio之后也升级使用了新的sdk,并配置了环境变量 2.启动了第三方模拟器 3.之后用adb devices命令就出现了上图的错误 从报错的原因来看应该是版本不一致导致的,大概的意思是说你现在的adb版本是31,但是你client端的却是36(这里的client端我猜就是第三方的模拟器)不匹配啊. 尝试解决下,既然版本不一致,那就

UESTC 31 饭卡(Card) --背包问题

背包问题. 思路:如果m<5,此时也不能消费,所以此时答案为m m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最大的那个菜的价格,就得到最小的余额. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using n

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31 本课程介绍: Oracle视频教程,风哥本套oracle教程培训<<Oracle数据库性能优化培训教程>>的第1/10套:Oracle性能优化之执行计划管理.主要学习Oracle性能优化简介,SQL 语句处理流程,软解析和硬解析,绑定变量及案例,游标的介绍,Oracle的优化器,执行计划的查看,SQL语句访问路径,SQL语句的连接方式,Oracle驱动表,执行计划的干预,常用hint提示的使用. 视频教

笔记:Struts 2.3.31 配置说明

复制文件到站点的 WEB-INF\lib 目录,文件列表如下,黄色突出显示的是必须加入的核心包 struts2-core-2.3.31.jar:struts2 的核心库 xwork-core-2.3.31.jar:由于Struts2是由xwork的延伸 有些类依然关联着 xwork的类 javassist-3.11.0.ga.jar:代码生成工具Hibernate用它在运行时扩展java类和实现,同cglib包 ognl-3.0.19.jar:OGNL表达式语言,struts2支持该EL fre

Struts 2.3.31 配置说明

复制文件到站点的 WEB-INF\lib 目录,文件列表如下,黄色突出显示的是必须加入的核心包 struts2-core-2.3.31.jar:struts2 的核心库 xwork-core-2.3.31.jar:由于Struts2是由xwork的延伸 有些类依然关联着 xwork的类 javassist-3.11.0.ga.jar:代码生成工具Hibernate用它在运行时扩展java类和实现,同cglib包 ognl-3.0.19.jar:OGNL表达式语言,struts2支持该EL fre

3-1 LVS-NAT集群

---- (整理)By 小甘丶 什么是集群: 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.(Cluster就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节点node). LVS: Linux Virtual Server的简写,意即Linux虚拟服务器 是一个虚拟的服务器集群系统,此项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. 集群宗旨: 可伸缩性(Scalability):

31个有用的系统管理员命令详解(linux)

在开始之前,你必须了解一下linux 基本知识: centos7目录结构.文件类型及权限.inode解析.信号 最常用的linux命令行快捷键.centos7 vi编辑器及环境变量的使用 Linux进程优先级及调度原理 1.Uptime 命令显示:运行时间.登陆用户数及1,5,15分钟间隔负载. # uptime 08:16:26 up 22 min,  1 user,  load average: 0.00, 0.03, 0.22 Uptime 命令仅有一个版本选项而且仅显示一天内的小时:分钟

第31章 新的设计模式

31.1 规格模式(Specitification Pattern) 31.1.1 查询筛选条件 (1)场景:根据条件从数据库的用户表中筛选出对象 (2)存在问题 ①findUserByAgeThan和findUserByName两个方法中除了if后面的判断条件不同,其他地方完全一样 ②这两个程序中唯一的变化点就是条件语句,可以将这里封装起来,后面的例子会设计一个规格类,用于封装整个条件语句. [编程实验]根据条件筛选用户表数据 //新设计模式——规格模式 //实例:实现不同条件的查询(不使用规

TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)

注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): TWinControl = class(TControl) private // 41个windows消息,几乎全部消息都是私有函数(因为不需要别人来调用).很多都是覆盖消息,也有少部分是首次出现. // 总结规律:直接接受消息的函数都起一个中转站的作用,其函数内容都十分简单. // WM_PAINT第一次出现,由某些直接继承Win控件的类使用.而图形控件和自绘控件会自己响应这个消息. // TControl 类控