[LIS dp]Wooden Sticks POJ - 1065 思路

http://poj.org/problem?id=1065

题意: 锯木机 开机首先要了1分钟  之后据木头 如果木头的长宽均小于等于上一块 就不需要重启 不然重启又花费一分钟

问最短 花费时间

思路:看了题解才明白可以转LIS 最长上升子序列

首先 按照长度 由大到小排序 相同时 按照宽度由大到小排序  

鸽笼原理 形成LIS长度的 递减序列 // 难以想象

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <list> 
using namespace std;
typedef long long ll;

const int maxn =5000+5;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double PI=acos(-1.0);

struct node{
	int h,w;
	bool operator<(const node &a) const {return (h==a.h&&w>a.w)||h>a.h;}
}sticks[maxn];

int dp[maxn],a[maxn];

int main(){
	int t,n;
	cin>>t;
	while(t--){
		memset(dp,INF,sizeof(dp));
		cin>>n;
		for(int i=0;i<n;i++) cin>>sticks[i].h>>sticks[i].w;
		sort(sticks,sticks+n);
		for(int i=0;i<n;i++) a[i]=sticks[i].w;
		for(int i=0;i<n;i++)
			*lower_bound(dp,dp+n,a[i])=a[i];
	//	for(int i=0;i<n;i++) cout<<a[i]<<"  ";cout<<endl;	
		printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
	}
	return 0;
} 

 

全部评论

相关推荐

小时候觉得老师是很伟大的职业&nbsp;感觉老师都是人中龙凤才能当&nbsp;后来考入大学&nbsp;发现以前的老同学也是公费师范生了&nbsp;他们什么样什么人品&nbsp;我还不清楚吗&nbsp;只能希望他们以后也会有改变&nbsp;要不纯属耽误孩子&nbsp;实习之后发现&nbsp;有的领导&nbsp;能当上领导也可能运气成分很多&nbsp;自己决策方面很差&nbsp;分配给属下的东西自己也说不明白&nbsp;&nbsp;前些年那些明星&nbsp;各种塌房&nbsp;少林寺大师都能有情人和孩子&nbsp;越长大越发现世界就是个草台班子&nbsp;以前对不懂的东西有一层羡慕的滤镜&nbsp;接触之后发现就不是那回事了
RazerYang:其实也是幸存者偏差,你只关注草台班子的部分,所以觉得世界都是草台班子。实际上你每天能安全地从床上醒来,有稳定的天然气、自来水和电力供应,能让你吃上热乎的饭菜,能收到持续稳定的信号去刷手机,花几块钱就能坐地铁从城市的一端快速移动到另一端,花几百块就能在一天之内安全穿越整个国家,这都不是一个草台班子能实现的。燃气、水利、电力、通信、公交、民航,还有最重要的公安和国防,这些都不是草台班子能做的,有无数普通人构筑了你生活的方方面面,而你也将加入他们。
我对___祛魅了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务