POJ 1836 Alignment
来源:互联网 发布:资源商城源码 编辑:程序博客网 时间:2024/06/09 20:41
题意分析:军队里站了一排人,要求你挑选几个人出列,使每个人都可以看见队列的左端或右端,问你最少几个人出列。
输入样例分析:
81.86 1.86 1.30621 2 1.4 1 1.97 2.2
8 是这排人的人数
下面的8个浮点数是每个士兵的身高(浮点数)。
解题思路:分别从左端,右端开始找到以每个士兵结尾的最长子序列。
枚举每一对士兵,左边士兵的左最长子序列和右边士兵的右最长子序列之和最大值就是最终这排人的数量,原这排人的数量减去最终这排人的数量就是结果。
求最长子序列可以参考我这篇文章:
http://blog.csdn.net/qq_38737992/article/details/77716831
#include <cstdio>#include <cstring>#include <iostream>using namespace std;int main(){ double s[1010]; // 存储士兵的身高 int d[1010], d1[1000]; // d[] 左最长子序列 d1[]右最长子序列 int n, i, j; scanf("%d",&n); // 原这排士兵的人数 for(i=1;i<=n;i++) scanf("%lf",&s[i]); memset(d,0,sizeof(d)); memset(d1,0,sizeof(d1)); //初始化 d[1] = 1, d1[n] = 1; for(i=2;i<=n;i++) // 左最长子序列 { d[i] = 1; for(j=1;j<i;j++) { if(s[i]>s[j]) d[i] = max(d[j]+1,d[i]); } } for(i=n-1;i>=1;i--) // 右最长子序列 { d1[i] = 1; for(j=n;j>i;j--) if(s[i]>s[j]) d1[i] = max(d1[j]+1,d1[i]); } int res = 0; for(i=1;i<n;i++) // 枚举每一对士兵 for(j=i+1;j<=n;j++) if(d[i]+d1[j]>res) res = d[i] + d1[j]; printf("%d\n",n-res);return 0;}
阅读全文
0 0
- POJ 1836 Alignment
- POJ 1836 Alignment
- poj 1836 Alignment
- Poj 1836 Alignment
- poj 1836 Alignment
- POJ 1836-Alignment
- poj 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment
- poj 1836 Alignment
- poj 1836 Alignment
- poj 1836 Alignment
- POJ - 1836 Alignment
- poj 1836 Alignment
- JavaScript集合对象遍历方法总结
- yii文件上传
- 恶意代码分析实战 安装INetSim在CentOS 7上
- LuoguP1063 能量项链
- SQL笔记:基本操作
- POJ 1836 Alignment
- springboot 学习
- Windows 10+Anaconda+Xgboost
- yii验证码
- 位移运算
- java的输入输出流
- spring boot(五):spring data jpa的使用
- Squid使用
- MyBatis在Oracle中插入数据并返回主键的问题解决