九度1500-出操队形

题目描述:

在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较高的就要排在队尾。突然,有一天出操负责人想了一个主意,想要变换一下队形,就是当大家都从楼上跑下来后,所有的学生都随机地占在一排,然后出操负责人从队伍中抽取出一部分学生,使得队伍中剩余的学生的身高从前往后看,是一个先升高后下降的“山峰”形状。据说这样的形状能够给大家带来好运,祝愿大家在学习的道路上勇攀高峰。(注,山峰只有一边也符合条件,如1,1、2,2、1均符合条件)

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=1000000):代表将要输入的学生个数。
输入的第二行包括n个整数:代表学生的身高(cm)(身高为不高于200的正整数)。
输出:
对应每个测试案例,输出需要抽出的最少学生人数。
样例输入:
6
100 154 167 159 132 105
5
152 152 152 152 152

样例输出:

0

4

分析:

这里应使用O(nlogn)的算法。先求总体递增子序列的长度,再求递减子序列的长度。这里为了复用LIS(最长上升序列长度)函数,把原来的数组逆序一下,就相当于求递减子序列的长度了。

参考代码如下:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4
 5 using namespace std;
 6
 7 int LongestGrowingNumberLength( int* arr,int length,int start)//从start处开始递增数组的最大长度
 8 {
 9     if(arr==NULL||length<=0||start<0) return 0;
10     int* begin=arr+start;
11     int* next=begin+1;
12     int count=1;
13     while(next<arr+length)
14     {
15         if(*begin==*next)
16         {
17          next++;
18          begin++;
19         }
20         if(*begin<*next)
21         {
22             *begin=*next;
23             next++;
24             count++;
25         }
26         else next++;
27     }
28     return count;
29 }
30
31 int GrowingNumberLengthCore(int* arr,int length,int start,int end)//最大正序递增长度
32 {
33     if(arr==NULL||length<0||start<0||end>length-1) return -1;
34     int MaxValue=LongestGrowingNumberLength(arr,length,0);
35     for(int i=1;i<end;i++)
36     {
37        int L=LongestGrowingNumberLength(arr,length,i);
38         if(MaxValue< L)
39         {MaxValue=L;}
40     }
41     return MaxValue;
42 }
43
44 void main()
45 {
46     int n;
47     cin>>n;
48     int* array=new int[n+1];
49     int* resever=new int[n+1];
50     for(int i=0;i<n;i++)
51     {cin>>array[i];}
52     for(i=0;i<n;i++)
53     {resever[i]=array[n-1-i];}
54     int grow=GrowingNumberLengthCore(array,n,0,n-1);//最大正序递增长度
55     int down=GrowingNumberLengthCore(resever,n,0,n-1);//最大正序递减长度也就是最大逆序递增长度
56     cout<<grow<<endl;
57     cout<<down<<endl;
58     cout<<(n+1-grow-down)<<endl;//最少删除的元素数
59 }
时间: 2024-10-13 09:00:20

九度1500-出操队形的相关文章

[ACM] 九度OJ 合唱队形 (最长递增子序列改版)

题目1131:合唱队形 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1680 解决:520 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, -, K,他们的身高分别为T1, T2, -, TK, 则他们的身高满足T1 < T2 < - < Ti , Ti > Ti+1 > - > TK (1 <= i <=

合唱队形 九度1131 RONOJ26

#include<stdio.h>#include<stdlib.h>int main(){ int students,max=0; int i,j; int a[100],b[100],c[100]; scanf("%d",&students); for(i=0;i<students;i++) scanf("%d",&a[i]); for(i=0;i<students;i++) //寻找从左边开始的最长上升子序列

九度 1214

#include <cstdio> #include <iostream> #include <string> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(fi

剑指OFFER之丑数(九度OJ1214)

题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 3 样例输出: 3 解题思路: 最简单的思路是,从1到大数,每个数都检测一遍是否是丑数,检测方法可以考虑 int ugly(int number){ if(number%2 == 0

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

九度 1203

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1205

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1351 只出现一次的数

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)