【POJ 1836】 Alignment
2015-08-13 22:27
369 查看
【POJ 1836】 Alignment
有一队士兵 已知每个士兵个头 想要从中选一些士兵出列 让剩下的士兵向左或向右能看到队首(及左边或右边的士兵个头都< 他)
两次LIS 从左往右 从右往左分别LIS
然后枚举找最少出队人数即可
代码如下:
有一队士兵 已知每个士兵个头 想要从中选一些士兵出列 让剩下的士兵向左或向右能看到队首(及左边或右边的士兵个头都< 他)
两次LIS 从左往右 从右往左分别LIS
然后枚举找最少出队人数即可
代码如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define esp 1e-8 using namespace std; double dp[1111];//左向右LIS double dpn[1111];//右向左LIS double ht[1111];//记录士兵身高 int lenup[1111],lendown[1111];//左向右对应位置LIS长度 右向左对应位置LIS长度 int tp; int dcmp(double x) { return x < -esp? -1: x > esp; } int main() { int n,i,j,mm; scanf("%d",&n); for(i = 0; i < n; ++i) { scanf("%lf",&ht[i]); } tp = 1; dp[0] = 0; for(i = 0; i < n; ++i) { for(j = tp; j > 0; --j) { if(dcmp(ht[i]-dp[j-1]) > 0) { if(j == tp) dp[tp++] = ht[i]; else dp[j] = dcmp(ht[i] - dp[j]) < 0? ht[i]: dp[j]; } } lenup[i] = tp-1; } tp = 1; dp[n-1] = 0; for(i = n-1; i >= 0; --i) { for(j = tp; j > 0; --j) { if(dcmp(ht[i]-dpn[j-1]) > 0) { if(j == tp) dpn[tp++] = ht[i]; else dpn[j] = dcmp(ht[i] - dpn[j]) < 0? ht[i]: dpn[j]; } } lendown[i] = tp-1; } mm = n; for(i = 0; i < n-1; ++i)//枚举找最少出队人数 { mm = min(mm,n-(lenup[i]+lendown[i+1])); } printf("%d\n",mm); return 0; }
相关文章推荐
- URAL 1784 K - Rounders 找规律
- 部分真题整理
- TCP并发服务器
- web service—底层调用本质+WSDL文档解析
- HDU1253-胜利大逃亡
- 选择排序SelectSort
- 创建表空间
- -[UIViewController _loadViewFromNibNamed:bundle
- iOS开发-Objc arrayWithCapacity: 深入分析
- 颜色直方图实现彩色图象分割
- HDU 4260(The End of The World-Hanoi塔从中间状态移动)
- coderforce 560 B
- Remove Duplicates from Sorted List
- linux内核定时器
- 新手笔记之print(?)
- cocoaPod使用教程
- 微信公众帐号开发教程
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- EL表达式
- android:CheckBox方法