poj 1065 最长上升子序列
2015-07-16 22:51
316 查看
题意:
有n支木棍,每只木棍有一个长度 l 和 重量 w。
每次处理第一只木根的时候要消耗 1 的时间,紧接其后的木棍们,若满足 l 和 w 都大于当前的木棍,可以不用消耗时间。
问在这样的条件下,合理安排木棍处理顺序,时间最小是多少。
解析:
先间 l 从小到大排序,然后求 w 的上升子序列,每次求完标记就行了。
代码:
有n支木棍,每只木棍有一个长度 l 和 重量 w。
每次处理第一只木根的时候要消耗 1 的时间,紧接其后的木棍们,若满足 l 和 w 都大于当前的木棍,可以不用消耗时间。
问在这样的条件下,合理安排木棍处理顺序,时间最小是多少。
解析:
先间 l 从小到大排序,然后求 w 的上升子序列,每次求完标记就行了。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #include <vector> #include <queue> #include <map> #include <set> #include <climits> #include <cassert> #define LL long long #define lson lo, mi, rt << 1 #define rson mi + 1, hi, rt << 1 | 1 using namespace std; const int maxn = 5000 + 10; const int inf = 0x3f3f3f3f; const double eps = 1e-8; const double pi = acos(-1.0); const double ee = exp(1.0); struct Machine { int l, w; bool operator < (const Machine a) const { if (l == a.l) return w < a.w; return l < a.l; } } mac[maxn]; bool vis[maxn]; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL int ncase; scanf("%d", &ncase); while (ncase--) { memset(vis, false, sizeof(vis)); int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d%d", &mac[i].l, &mac[i].w); } sort(mac, mac + n); int ans = 0; for (int i = 0; i < n; i++) { int lastW = mac[i].w; if (!vis[i]) { for (int j = i + 1; j < n; j++) { if (!vis[j]) { if (lastW <= mac[j].w) { vis[j] = true; lastW = mac[j].w; } } } ans++; } } printf("%d\n", ans); } return 0; }
相关文章推荐
- 深入理解JavaScript系列(37):设计模式之享元模式
- Potocol Buffer详解
- nodejs+express +jade模板引擎 新建项目
- MyBatis知多少(9)不同类型的数据库
- hdu1029 Ignatius and the Princess IV(DP求数列中出现次数过半的数)
- php-max_execution_time
- java TCP上传文本
- [web安全] SQL注入之MySQL
- win8.1下IE11按F12调出开发工具的莫名异常问题解决
- html5--cavas画圆
- android 自定义view
- 控制台浏览器代码实战
- UIKit框架 -09.UIPageControl
- string库(string.h)字符串查找函数
- iOS多线程
- JavaScript数组
- VS2010安装boost
- 数字转表格标题 Excel Sheet Column Title
- 修改android应用包名
- 修改android应用包名