您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心算法