Problem I
2016-03-24 21:21
239 查看
简单题意
现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模版的。
木工机需要的准备时间如下:
第一根木棒需要1min的准备时间;
在加工了一根长为l,重为w的木棒之后,接着加工一根长为l '
(l ≤ l' ),重为w'(
w≤w')的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。
解题思路形成过程
首先是对木棒排序,优先按长度排序,长度相等时按重量排序,然后找出最长的重量递增的子数列,用一个数组记录分组序号,最后序号最大的就是最少时间
感想
虽然方法不是自己原创,看了老师的思路好长一段时间,才明白思路,感觉真的很巧妙
AC代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <string>
#include <fstream>
using namespace std;
struct stick{
int l;//³¤¶È
int w;//ÖØÁ¿
};
bool cmp(stick a,stick b){
if(a.l==b.l)return a.w<a.w;
else if(a.l<b.l)return true;
return false;
}
int main(){
ifstream cin("in.txt");
vector<stick>v;
stick s;
int t,n;
cin>>t;
while(t--){
cin>>n;
v.clear();
for(int i=0;i<n;i++){
cin>>s.l>>s.w;
v.push_back(s);
}
sort(v.begin(),v.end(),cmp);
int a[5001];
int k;
memset(a,0,sizeof(a));
a[0]=1;
for(int i=1;i<n;i++){
k=0;
for(int j=0;j<i;j++){
if(v[i].w<v[j].w&&k<a[j])k=a[j];
a[i]=k+1;
}
}
int max=0;
for(int i=0;i<n;i++)
if(a[i]>max)max=a[i];
cout<<max<<endl;
}
return 0;
}
现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模版的。
木工机需要的准备时间如下:
第一根木棒需要1min的准备时间;
在加工了一根长为l,重为w的木棒之后,接着加工一根长为l '
(l ≤ l' ),重为w'(
w≤w')的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。
解题思路形成过程
首先是对木棒排序,优先按长度排序,长度相等时按重量排序,然后找出最长的重量递增的子数列,用一个数组记录分组序号,最后序号最大的就是最少时间
感想
虽然方法不是自己原创,看了老师的思路好长一段时间,才明白思路,感觉真的很巧妙
AC代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <string>
#include <fstream>
using namespace std;
struct stick{
int l;//³¤¶È
int w;//ÖØÁ¿
};
bool cmp(stick a,stick b){
if(a.l==b.l)return a.w<a.w;
else if(a.l<b.l)return true;
return false;
}
int main(){
ifstream cin("in.txt");
vector<stick>v;
stick s;
int t,n;
cin>>t;
while(t--){
cin>>n;
v.clear();
for(int i=0;i<n;i++){
cin>>s.l>>s.w;
v.push_back(s);
}
sort(v.begin(),v.end(),cmp);
int a[5001];
int k;
memset(a,0,sizeof(a));
a[0]=1;
for(int i=1;i<n;i++){
k=0;
for(int j=0;j<i;j++){
if(v[i].w<v[j].w&&k<a[j])k=a[j];
a[i]=k+1;
}
}
int max=0;
for(int i=0;i<n;i++)
if(a[i]>max)max=a[i];
cout<<max<<endl;
}
return 0;
}