目录
双调序列
思路:
代码:
时间复杂度:
总结:
题目链接:
双调序列
题目描述:
XJ编程小组的童鞋们经常玩一些智力小游戏,某月某日,小朋友们又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述:
假定有n(n<=1000)个整数,双调序列的第一个数是n个整数中的最大数,第二个数是n个整数中的最小数,第三个数是n个数中的第二大数,第四个数是n个数中的第二小数……取过的数不能再取,依次类推,直到结束。
请你用程序正确的帮他找出这n个数的双调序列。
输入格式:
第1行为一个整数n。
接下来n行给出了题目中所述的n个整数,每行包含一个整数。
输出格式:
有n行,每行为一个整数,是满足条件的双调序列
样例输入:
5 10 -1 3 3 -9
样例输出:
10 -9 3 -1 3
约定:
1<=n<=1000
思路:
这道题,我们可以首先将输入的一组数进行排序,排完序之后肯定不是双调序列,级需要特殊的方法.
按从小到大排完序后,下标为0的数最小,下标为n-1的数最大,下标为1的数第二小,下标为n-2的数第二大,就按照这样的方式,for循环依次输出,就可以达到题目要求.
代码:
//双调序列
//正解:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,j=1,x,y=0;
cin>>n; //输入
x=n-1; //最大下标
int a[n]; //数组
for(int i=0;i<n;i++) //循环输入
cin>>a[i];
sort(a,a+n); //从小到大排序
for(int i=0;i<n;i++,j++){ //双调序列输出
if(j%2==1) //按照奇偶数性质判断时输出大的还是小的
cout<<a[x--]<<endl; //输出最大的数,之后将x--,相当于(n-1)-1=n-2
else //输出小的
cout<<a[y++]<<endl; //最0开始,依次+1
}
return 0;
}
时间复杂度:
一个冒泡排序,复杂度是O(N^2);
然后依次循环到N的遍历,复杂度是O(N);
总复杂度就是O(2^N+N);
N最大为1000,最大复杂度是100万多1000,按C++每秒800万次的速度,不会超时!
总结:
这道题考的是关于排序和循环,奇偶数性质,双指针(程序里面的x和y就是两个相向的双指针)的多重应用.
题目链接:
https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=9550&pattern=0https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=9550&pattern=0