合唱队
2015-08-06 21:19
351 查看
/****************************************************************************************** 【题目】 描述:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置 就能排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K, 他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti ,Ti > Ti+1 > … > TK (1 <= i <= K) 。 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。 输入:第一行整数 N,表示同学的总数 ;第二行整数数组,空格隔开,表示 N 位同学身高。 输出:最少需要几位同学出列 样例输入: 8 186 186 150 200 160 130 197 200 样例输出: 4 【思想】 位置信息编码: 1)对同一个元素在其位置求正逆序数(即距离长度) 2)把求得的正逆序数(即距离长度),同一位置求和。 3)排序,把求和后最大的那个输出。 **************************************************************************************/ //测试通过 //但没有,解决哪几个人出列,求大牛赐教 //参考0.1克药丸的重量编码 #include <iostream> #include <string> using namespace std; int main() { int len,i; cin >> len; int *Array = new int[len];//指向一个数组空间,但数组没有名字。 for(i=0; i<len; ++i)//赋数组值 cin >> Array[i];//用这种方式操作数组值 // lis[i]表示以A[i]为结尾的最长递增子序列的长度 int *list = new int[len]; // lds[i]表示以A[i]为起点的最长递减子序列的长度 int *ldst = new int[len]; for ( i = 0; i < len; ++i) //赋距离初值 { list[i] = 1; ldst[i] = 1; } for( i=1; i<len; ++i) for(int j=0; j<i; ++j)//j<i;表示求i元素之前的续 if(Array[i] > Array[j] && list[i] < list[j]+1) list[i] = list[j] + 1; for(i=len-2; i>=0; --i)//i从倒数第二个开始 for(int j=len-1; j>i; --j)//i从倒数第一个开始 if(Array[i] > Array[j] && ldst[i] < ldst[j]+1) ldst[i] = ldst[j] + 1; int maxl = 0; for(i=0; i<len; ++i)//同一位置求正逆续总长度 if(maxl < list[i]+ldst[i]) maxl = list[i] + ldst[i]; cout << len - maxl + 1 << endl;//为什么 delete [] list; delete [] ldst; delete [] Array; return 0; }
相关文章推荐
- CentOS7.1 安装NVIDIA显卡驱动(双显卡:集显和独显)
- 深搜从n个数中找和为k的数
- SELinux深入理解
- poj 3320 尺取法
- HDOJ-1016-Prime Ring Problem(素数环)【DFS】
- 重温《C++ Primer》笔记十 当数组作为函数参数时
- Appium 服务关键字
- TC SRM 397 2 250
- 使用Dom解析xml文件的属性节点
- 解决ofbiz在myeclipse中调试运行时报错:Can't find bundle for base name cache
- Android 加载大图的缩略图显示
- hdoj1212
- 【西祠日志】【17】初识AngularJS,下一代Web应用的前端
- 妙味课堂视频笔记总结
- 2.Kali安装VMware tools(详细+异常处理)
- iOS设计模式 - 单例
- python练习之通过python pexpect实现自动生成openssl证书
- poj2386水洼dfs
- UDK控制台命令概览
- 十一讲,买花