• 20171005校内模拟赛 题解


    T1.小 小 Z Z 厌回文 (string) )
    小 Z 喜欢很多东西,但他讨厌回文串。他称一个字符串美丽当且仅当这个
    字符串不包含任何长度大等于 2 的回文串。
    现在他得到了一个仅由前 p 个小写字母组成的美丽字符串,小 Z 想知道字
    典序比这个字符串大,且同样仅包含前 p 个小写字母的美丽字符串中字典序最
    小的是什么。
    [ [ 输入格式] ]
    从 string.in 中读取数据。
    第一行读入两个数 n 和 p,表示字符串长度和字符集大小。
    接下来 1 行一个字符串 S,表示小 Z 得到的魅力串。
    [ [ 输出格式] ]
    输出小 Z 想知道的美丽串。如果这样的字符串不存在,输出 NO。
    [ [ 样例输入] ]
    3 4
    cba
    [ [ 样例输出] ]
    cbd
    [ [ 数据范围与约定] ]
    对于 30%的数据, n<=2000
    对于 100% 的数据 n<=100000 p<=26
    保证数据合法

    乱搞

    #include<cstdio>
    int n,p;
    int a[100001];
    char s[100001],ans[100001];
    bool dfs(int x,bool fl){
        if(x==n+1) return 1;
        int i;
        if(fl==1) i=0;
        else{
            i=a[x]; if(x==n) i++;
        }
        for(;i<p;i++){
            if(x>1&&ans[x-1]==i||x>2&&ans[x-2]==i) continue;
            ans[x]=i;
            if(i>a[x]) fl=1;
            if(dfs(x+1,fl)) return 1;
        }
        return 0;
    }
    int main(){
        freopen("string.in","r",stdin);
        freopen("string.out","w",stdout);
        scanf("%d%d",&n,&p);
        scanf("%s",s+1);
        for(int i=1;i<=n;i++){
            a[i]=s[i]-'a';
        }
        if(dfs(1,0)){
            for(int i=1;i<=n;i++){
                ans[i]=ans[i]+'a';
            }
            printf("%s
    ",ans+1);
        }
        else puts("NO");
        return 0;
    }

    T2.小 小 Z Z 爱排序( ( sorting) )
    小 Z 对排序算法深有了解,但是这天他遇到了一个问题。
    小 Z 需要对一个 1 到 n 的排列进行升序排序, 也就是说排序之后这个排列将
    会变成 1,2,3,…,n。 但是小 Z 可以做的操作只有一种, 就是选择这个排列中的一个
    元素,把它拿出来,然后接到整个排列的最前面或者最后面。比如,如果对排列
    321 中的 2 进行操作,那么可以得到的排列有 231 和 312。小 Z 想知道,在最优
    情况下他至少要进行几次操作才可以让这个排列升序排序?
    [ [ 输入格式] ]
    从 sorting.in 中读取数据。
    第一行 1 个数 n,表示排列的元素数量。
    接下来一行 n 个数,描述要排序的排列。
    [ [ 输出格式] ]
    输出一个数,表示最小操作数。
    [ [ 样例输入] ]
    3
    3 2 1
    [ [ 样例输出] ]
    2

    找最长连续上升子序列,用n减就是答案。

    #include<cstdio>
    int n,x,ans=-1;
    int f[100001];
    int main(){
        freopen("sorting.in","r",stdin);
        freopen("sorting.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            f[x]=f[x-1]+1;
            if(f[x]>ans) ans=f[x];
        }
        printf("%d
    ",n-ans);
        return 0;
    }

    T3.小 小 Z Z 爱旅行 (travel) )
    放假了,小 Z 准备去郊外一些景点旅行。为此,它查明了学校附近的一些
    景点和这些景点之间的一些单向道路。 国庆长假总共有 8 天, 但是小 Z 其中 4 天
    都要训练,所以他打算挑选 4 个不同的景点,按照顺序从第一个景点开始,然后
    依次前往第二、三个,最后到达第四个景点。小 Z 很懒,所以把设计线路的任务
    交给了你。你当然没安好心啦,所以你想要设计的路线的长度最长。小 Z 很聪
    明,总是会走最短的路径,现在请你设计这条路线吧。
    小 Z 只根据路径经过的道路的条数判断路径的长短,在他眼中所有道路的
    长度都相同。
    [ [ 输入格式] ]
    从 travel.in 中读取数据。
    第一行两个数字 n,m,表示景点的数量和道路的数量。
    接下来 m 行,每行两个整数 ui,vi,表示有一条从 ui 到 vi 的单向道路。
    [ [ 输出格式] ]
    输出包含 1 行 4 个整数,依次表示小 Z 要前往的 4 个景点。相邻景点间,前一
    个景点必须有路径能够到达后一个景点, 数据保证一定存在这样的线路。 如果有
    多个最长线路,你可以输出任意一个。
    [ [ 样例输入] ]
    8 9
    1 2
    2 3
    3 4
    4 1
    4 5
    5 6
    6 7
    7 8
    8 5
    [ [ 样例输出] ]
    2 1 8 7
    [ [ 样例解释] ]
    2 到 1 的距离是 3,1 到 8 的距离是 7,8 到 7 的距离是 3,总距离 13。
    可以证明这是一条距离最大的路线。
    [ [ 数据范围与约定] ]
    本题采用子任务制, 你只有通过同一子任务内的所有测试点才能得到这个测试点
    对应的分数。
    Subtask1: 包含 30Points 满足 n<=100
    Subtask2: 包含 30Points 满足 n<=500
    Subtask3: 包含 40Points 满足 n<=2000,m<=4000

  • 相关阅读:
    jqgrid自带多选与单选
    NPOI读写Excel【转载】
    C# 對 List<string> 取交集、補集、超集、串聯
    在前端解決顯示null值一例
    Linux netstat命令详解和使用例子(显示各种网络相关信息)
    Git 忽略規則及 .gitignore 規則不生效的辦法
    树莓派上传数据错误一例
    搭建本地SVN資料
    利用樹霉派採集溫濕度上傳到OneNET(非完整,僅參考)
    部署ASP.Net Core 2.1 項目到 IIS
  • 原文地址:https://www.cnblogs.com/nzher/p/7631260.html
Copyright © 2020-2023  润新知