zoukankan      html  css  js  c++  java
  • [CSP-S模拟测试]:序列(构造)

    题目描述

    给定$N,A,B$,构造一个长度为$N$的排列,使得:
    $ullet$排列长度为$N$;
    $ullet$最长上升子序列长度为$A$;
    $ullet$最长下降子序列长度为$B$。
    我们有$SPJ$,有解任意给出一组,否则说明无解。


    输入格式

    第一行一个整数$T(1leqslant Tleqslant 10)$,表示数据组数。
    接下来$T$行,每行三个正整数$N$、$A$、$B$。


    输出格式

    对每组数据:
    如果有解,输出两行,第一行一个字符串$Yes$,接下来一行$N$个整数,表示排列。
    否则,输出一行一个字符串$No$。


    样例

    样例输入:

    3
    4 2 2
    4 4 1
    4 3 3

    样例输出:

    Yes
    3 4 1 2
    Yes
    1 2 3 4
    No


    数据范围与提示

    对于全部的测试数据,保证$Tleqslant 10,Nleqslant 10^5,sum Nleqslant 2 imes 10^5
    $ullet$子任务$1$($20$分):$Nleqslant 5$。
    $ullet$子任务$2$($30$分):每组数据均满足$N=A imes B$。
    $ullet$子任务$3$($20$分):$Bleqslant 2$。
    $ullet$子任务$4$($30$分):无特殊限制。


    题解

    一看就是一个构造题,先从$N=A imes B$入手,我们可以将序列分成$B$块,让这$B$块内部构成长度为$A$的上升序列,$B$块相互之间呈下降序列即可。

    举个栗子,当$N=10,A=2,B=5$,我们可以将其构造成:$(9,10),(7,8),(5,6),(3,4),(1,2)$;可以发现,每一个小括号内呈上升,而小括号之间是下降序列。

    如果不满足$N=A imes B$,我们还可以接着用这样的思想。

    最后来考虑$No$的情况,如果$A+B<N-1$,那么显然不行;如果$A imes B<N$也是不行的。

    于是这到题就被解决了。

    时间复杂度:$Theta(N)$。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int T;scanf("%d",&T);
    	while(T--)
    	{
    		int N,A,B;scanf("%d%d%d",&N,&A,&B);
    		if(N<A+B-1||N>1LL*A*B){puts("No");continue;}
    		int len=N-B;puts("Yes");
    		for(int i=1;i<=B;i++)
    		{
    			int now=1;
    			while(now<A&&len){len--;now++;}
    			for(int j=N-now+1;j<=N;j++)printf("%d ",j);
    			N-=now;
    		}puts("");
    	}
    	return 0;
    }
    

    rp++

  • 相关阅读:
    JS匿名函数及调用及闭包
    js的变量提升和函数提升
    JS调用模式以及bind()方法
    转载:JS call()方法和apply()方法
    创建一个用于上传文件的表单
    POST 异步请求 url没有明文显示
    转载:nodejs res.end和res.send 区别
    HTTP中get和post区别
    通读cheerio API
    转载:JS数组reduce()和reduceRight()方法
  • 原文地址:https://www.cnblogs.com/wzc521/p/11689814.html
Copyright © 2011-2022 走看看