level 4
【问题描述】
一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的。棍子可以被一台机器一个接一个地加工。机器处理一根棍子之前需要准备时间。准备时间是这样定义的:
第一根棍子的准备时间为1分钟;
如果刚处理完长度为L,宽度为W的棍子,那么如果下一个棍子长度为Li,宽度为Wi,并且满足L>=Li,W>=Wi,这个棍子就不需要准备时间,否则需要1分钟的准备时间;
计算处理完n根棍子所需要的最短准备时间。比如,你有5根棍子,长度和宽度分别为(4, 9),(5, 2),(2, 1),(3, 5),(1, 4),最短准备时间为2(按(4, 9)、(3, 5)、(1, 4)、(5, 2)、(2, 1)的次序进行加工)。
【输入】
第一行是一个整数n(n<=5000),第2行是2n个整数,分别是L1,W1,L2,w2,…,Ln,Wn。L和W的值均不超过10000,相邻两数之间用空格分开。
【输出】
仅一行,一个整数,所需要的最短准备时间。
【样例】
stick.in
5
4 9 5 2 2 1 3 5 1 4
stick.out
2
时间限制:1秒 空间限制:64M
2009年07月20日 08点07分
1
level 7
见POJ1065 贪心
按L为第一关键字,W为第二关键字排序(反过来也行),然后统计一下组合的序列数就行了
2009年07月20日 11点07分
2
level 1
请大家帮我看一下什么地方错了
木棍加工 解题报告
说一下我的方法,只过了3个点的方法
(肯定是有不对的地方,希望大家帮助更正)
就是用一个平面直角坐标系来直观的比较
比如说样例吧
4 9 5 2 2 1 3 5 1 4
放到坐标系里就是这个样子(当然先按长度排序【宽度也可】)
|
9 *
|
8
|
7
|
6
|
5 *
|
4 *
|
3
|
2010年02月19日 15点02分
3
level 1
2 *
|
1 *
|
O---1---2---3---4---5---6----
这样问题就转化成了用n个以图中点和O构造的矩形覆盖所有点,求最小的n
我的DP做法是这样的:
到第一点,肯定是一个矩形f[1]:=1
到第二点,因为w[2]<w[1]所以f[2]:=f[1]+1=2
到第三点,因为w[3]>w[j](1<=j<3),所以f[3]:=1
到第四点,f[4]:=1
到第五点,因为w[5]<w[4]所以f[5]:=f[4]+1=2
当然还有一些情况,比如w[i-1]<w[i] 但是w[j](1<=j<i)>w[i]【注意,j是满足条件的点中最接近i的,即downto查找到的第一个】那么我认为
由于之前所有纵坐标比w[i]小的由于横坐标和纵坐标都比横坐标为j的点
所以已经全被包括了,需要计算的只是j到i之间的点(他们的纵坐标一定小于w[i])
但是既然有一个已经确定了的以i为顶点的矩形,那么中间的这些点也一定全包括
所以这种情况下,f[i]:=f[j]+1
所以状态转移方程:
for i:=2 to n do
begin
t:=0;
for j:=i-1 downto 1 do
if w[j]>w[i] then begin
t:=1;f[i]:=1+f[j];break;
end;
if t=0 then f[i]:=1;
end;
边界:
f[1]:=1
目标:
f[n]
为什么WA呢?大家帮帮忙啊······
pascal代码:
program stick;
var n,i,j,t:longint;
l,w,f:array[1..5000] of longint;
procedure change(var a,b:longint);
var c:longint;
begin
c:=a;a:=b;b:=c;
end;
begin
assign(input,'stick.in');reset(input);
assign(output,'stick.out');rewrite(output);
readln(n);
for i:=1 to n do read(l[i],w[i]);
for i:=n downto 2 do
begin
for j:=i downto 2 do
if l[j]>l[j div 2] then begin
change(w[j],w[j div 2]);
change(l[j],l[j div 2]);
end;
change(w[1],w[i]);
change(l[1],l[i]);
end;
f[1]:=1;
for i:=2 to n do
begin
t:=0;
for j:=i-1 downto 1 do
if w[j]>w[i] then begin
t:=1;f[i]:=1+f[j];break;
end;
if t=0 then f[i]:=1;
end;
writeln(f[n]);
close(input);close(output);
end.
2010年02月19日 15点02分
4
level 1
这种题目还要跑到贴吧来问》?
#include <cstdio>#
include #define N 10000using namespace std;struct arr{ int l,w;}a[N];int n,ans,f[N];int so(arr x,arr y){ if (x.l==y.l) return x.w>y.w; return x.l>y.l;}int max(int x,int y){ return x>y?x:y;}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].w); sort(a+1,a+n+1,so); for (int i=1;i<=n;i++) { for (int j=1;ja[j].l) f[i]=max(f[i],f[j]+1); else if (a[i].w>a[j].w) f[i]=max(f[i],f[j]+1); ans=max(ans,f[i]); } printf("%d",ans+1);}
2018年05月01日 13点05分
7