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

原文地址:https://www.cnblogs.com/nzher/p/7631260.html