4.28考试总结(上午)

1、挖地雷(lei.cpp)时空限制1000ms / 128MB

题目描述

在一个地图上有NN个地窖(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入格式:(lei.in)

有若干行。

第1行只有一个数字,表示地窖的个数N。

第2行有N个数,分别表示每个地窖中的地雷个数。

第3行至第N+1行表示地窖之间的连接情况:

第3行有n-1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为11000…0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

第4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

… …

第n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

输出格式:(lei.out)

有两行

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

输入输出样例

输入样例#1:

5

10 8 4 7 6

1 1 1 0

0 0 0

1 1

1

输出样例#1:

1 3 4 5

27

【思路】:

就是直接用dp,用f[i]表示从i挖能挖到的最多的地雷,f[i]=max(f[i],f[j])

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
const int maxn=999999999;
const int minn=-999999999;
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < ‘0‘ || c > ‘9‘) {
        if(c == ‘-‘) f = -1;
        c = getchar();
    }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * f;
}
int n,pre[215],a[215],g[215][215],ans,t,f[215];
void print(int x) {//递归输出路径
    if(pre[x]==0) {
        printf("%d",x);
        return ;
    }
    print(pre[x]);
    printf(" %d",x);//注意空格问题
}

int main() {
    freopen("lei.in","r",stdin);
    freopen("lei.out","w",stdout);
    n=read();
    for(int i=1; i<=n; ++i) {//读入地雷
        scanf("%d",a+i);
    }
    for(int i=1; i<=n; ++i) {
        for(int j=i+1; j<=n; ++j) {
            int x=read();
            if(x==1)
                g[i][j]=1;//存是否存在路径
        }
    }
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=n; ++j) {
            if((g[j][i]==1)&&(f[j]>f[i])) {
                f[i]=f[j];
                pre[i]=j;
            }
        }
        f[i]+=a[i];
        if (f[i]>ans) {
            ans=f[i];
            t=i;
        }
    }
    print(t);
    cout<<‘\n‘;
    printf("%d",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

题目背景

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

题目描述

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

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

输入输出格式

第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L≥1 且 N≥M≥0。

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

输入输出样例

输入样例#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>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
const int maxn=999999999;
const int minn=-999999999;
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < ‘0‘ || c > ‘9‘) {
        if(c == ‘-‘) f = -1;
        c = getchar();
    }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * f;
}
int a[2000002],mid,l,r,ans,L,N,M,now_juli,js;
int check(int x) {
     now_juli=0,js=0;
    /*js是表示搬走的石头数量,now_juli是当前的石头离起点的距离*/
    for(int i=1; i<=N+1; ++i) {
        if(a[i]-now_juli<x) { //比较两点之间的距离
            js++;
        } else {
            now_juli=a[i];
        }
    }
    if(js>M)
        return 0;
}
int main() {
//    freopen("stone.in","r",stdin);
//    freopen("stone.out","w",stdout);
    scanf("%d%d%d",&L,&N,&M);
    if(N==0&&M==0)
    {
        cout<<L;
        return 0;
    }
    int l=0,r=L;//初始化二分边界
    for(int i=1; i<=N; i++)
        scanf("%d",&a[i]);
    /*注意输入距离从近到远,答案有单调性*/
    a[N+1]=L;//注意设置终点,呜呜呜浪费我20分钟查错误
    while(l<=r) {
        mid=(l+r)/2;
        if(check(mid)) { //右
            l=mid+1;
            ans=mid;
        } else {     //左
            r=mid-1;
        }
    }
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

3、花匠flower.cpp(时空限制1000ms / 128MB)

题目描述

花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。

具体而言,栋栋的花的高度可以看成一列整数h1?,h2?,...,hn?。设当一部分花被移走后,剩下的花的高度依次为g1?,g2?,...,gm?,则栋栋希望下面两个条件中至少有一个满足:

条件 A:对于所有g2i?>g2i−1?,g2i?>g2i+1?

条件 BB:对于所有g2i?<g2i−1?,g2i?<g2i+1?

注意上面两个条件在m=1时同时满足,当m > 1时最多有一个能满足。

请问,栋栋最多能将多少株花留在原地。

输入输出格式

输入格式:

第一行包含一个整数n,表示开始时花的株数。

第二行包含n个整数,依次为h1?,h2?,...,hn?,表示每株花的高度。

输出格式:

一个整数m,表示最多能留在原地的花的株数。

输入输出样例

输入样例flower.in

5

5 3 2 1 2

输出样例flower.out

3

说明

【输入输出样例说明】

有多种方法可以正好保留 3 株花,例如,留下第 1、4、5 株,高度分别为 5、1、2,满足条件 B。

【数据范围】

对于 20%的数据,n ≤ 10;

对于30%的数据,n ≤ 25;

对于 70%的数据n≤1000,0≤hi?≤1000;

对于100%的数据,1≤n≤100,000,0≤hi?≤1,000,000,所有的hi?随机生成,所有随机数服从某区间内的均匀分布。

【思路】:和合唱队形一样的思路。用二维数组表示到i点的最长上升和最长下降.

然后统计波峰和波谷

原文地址:https://www.cnblogs.com/pyyyyyy/p/10783212.html

时间: 2024-08-30 18:15:56

4.28考试总结(上午)的相关文章

2016年上半年软件设计师考试试题上午卷(26-50题)

获得武功秘籍,修的一身好功夫,就能如鱼得水般行走于江湖中.获得软考真题,取得命题方向,成功通过考试就游刃有余.下面希赛软考学院为您整理了2016年上半年软件设计师考试真题上午卷,助你轻松备考. 2016年上半年软件设计师考试试题上午卷(26-50题) ●进程P1.P2.P3.P4和P5的前趋图如下图所示: 若用PV操作控制进程P1.P2.P3.P4和P5并发执行的过程,则需要设置5个信号S1.S2.S3.S4和S5,且信号量S1-S5的初值都等于零.下图中a和b处应分别填(26):c和d处应分别

2016年上半年软件设计师考试试题上午卷(1-25题)

获得武功秘籍,修的一身好功夫,就能如鱼得水般行走于江湖中.获得软考真题,取得命题方向,成功通过考试就游刃有余.下面希赛软考学院为您整理了2016年上半年软件设计师考试真题上午卷,助你轻松备考. 2016年上半年软件设计师考试试题上午卷(1-25题) ●VLIW是(1)的简称. A.复杂指令系统计算机 B.超大规模集成电路 C.单指令流多数据流 D.超长指令字 ●主存与Cache的地址映射方式中,(2)方式可以实现主存任意一块装入Cache中任意位置,只有装满才需要替换. A.全相联 B.直接映射

2016年上半年软件设计师考试试题上午卷(51-75题)

获得武功秘籍,修的一身好功夫,就能如鱼得水般行走于江湖中.获得软考真题,取得命题方向,成功通过考试就游刃有余.下面希赛软考学院为您整理了2016年上半年软件设计师考试真题上午卷,助你轻松备考. 2016年上半年软件设计师考试试题上午卷(51-75题) ●数据的物理独立性和逻辑独立性分别是通过修改(51)来完成的. A.外模式与内模式之间的映像.模式与内模式之间的映像 B.外模式与内模式之间的映像.外模式与模式之间的映像 C.外模式与模式之间的映像.模式与内模式之间的映像 D.模式与内模式之间的映

5.28 考试修改+总结

今天又是一个悲伤的故事,所有排名比我高的人第一题都A了 而我第一题爆零了 但是开心的事情是:第一题没有说是简单图,所以题解是错的 不管怎么样,将错就错吧 今天下午断网了,所以这时候才写blog 第一题 由于题目中没有给出欧拉图的概念,所以我完全不知道它在说啥,于是就爆零了 然后欧拉图就是存在欧拉回路的简单图,具有以下特点: 1.联通 2.度数都是偶数 显然我们将错就错看题目的话,把欧拉图数目*(n*(n-1)/2+1)就可以得到答案了 然后我们很容易知道度数均为偶数的图的数目是2^((n-1)*

2.28考试小记

翻车翻得厉害了点啊-- 上来看到第一题发现题目很简洁啊,一般来说简洁的题目都没好事,看了一下数据范围,果然只有20分的暴力分,努把力可能还有一点输出0的分.第二题博弈论,上来40分明显白送,读了几遍特殊数据之后想到了60分解法,看来这道题还是很可做的.第三题竟然是原题,额,虽然模糊的记得正解的细节.但是清楚地记得当初改这道题的时候看了一晚上题解和标程,看着标称连打带调敲了一个上午加上半个下午,虽然知道正解,但明显需要大量时间投入. 于是开始优先做第二题,20分暴力由于数组在搜索的时候没有都还原等

2.28考试

上来通读一遍题目.T3好像做过吧,好像挺麻烦的,老师可能会换题,那就先放放吧. 听从建议,先看部分分. T1想了半天,想出了一个貌似正确的做法,写了之后发现过不了样例,输出路径发现做法根本是错的,写了一个暴力扔一边了. T2从小的部分分开始看,20分的搜,20分是NIM,10分+10分判一下1就好.写完调完发现9点半了,T3没时间了,感觉T2也想不出来了,去码T3. T3先写了一个保稳的manacher,有30分,之后写后缀数组+记忆化搜索.11点多过了自己出的样例. 估分:30+50+100=

江西省2016年上半年中小学教师资格考试报考步骤指导及培训安排

根据教育部考试中心<关于2016年上半年中小学教师资格考试考务相关事宜的通知>(教试中心函[2015]243号)精神,2016年上半年中小学教师资格考试笔试将于3月12日举行,为方便各位考生顺利报考及通过考试,现将报考操作步骤及培训课程安排告知如下: 一.时间安排 1.考生网上报名时间:2016年1月13—19日(含节假日) 2.考区网上审核时间:2016年1月15—21日 3.考生网上缴费时间:2016年1月15—22日 4.考生网上打印准考证时间:2016年3月7—12日 5.笔试考试时间

信息系统项目管理师考试、报名、复习、备考问题大全

1. 信息系统项目管理师考试是什么? 答: 信息系统项目管理师属于计算机技术与软件专业技术资格(水平)考试(即软考)高级资格考试里面的一项考试.简单的说,考过这个考试,代表你将拥有高级专业技术资格,从级别上讲,它相当于是高级会计.副教授.高级教师.副主任医师.这些曾经你认为是高大上的职称级别,考过这个考试你也可以拥有了. 当然,这只是级别上的相同,不代表它们的待遇和价值是一样的.说实话,不管是什么证书,可能能让你多一些这样那些的机会,但永远不要把证书捧在手里当金子,否则你会失望的. 你自己才是真

【红帽RHEL7.0版RHCE考试经历】

2014年7月,为大力推广redhat Enterprise Linux7操作系统,红帽将基RHCE认证由RHEL6转换到RHEL7上. 面对新的软件功能.新认证课程内容,初期认证学员的考试通过率一直处于较低水平,为此红帽官方还专门举办培训机构的辅导班,致力于查找和发现培训课程方面的问题. 同时,社会上的培训机构积极掌握授课要求,探索训练试题,强化模拟考试,以其稳定提升学员RHCE认证的通过率. 我于2月15日参加并通过的考试,1小时完成RHCSA,2小时完成RHCE. 1. 关于备考练习 (1