1. 程式人生 > >貪心入門題——木棍

貪心入門題——木棍

問題 C: 木棒

時間限制: 1 Sec  記憶體限制: 32 MB
提交: 10  解決: 6
[提交][狀態][討論版]

題目描述

現有n根木棒,已知它們的長度和重量。要用一部木工機一根一根地加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模板的。木工機需要的準備時間如下:
(1)第一根木棒需要1min的準備時間;
(2)在加工了一根長為l,重為w的木棒之後,接著加工一根長為ll(l<=ll),重為ww(w<=ww)的木棒是不需要任何準備時間的。否則需要一分鐘的準備時間。
給定n根木棒,你要找到最少的準備時間。例如現在有長和重分別為(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那麼所需準備時間最少為2min,順序為(1,4),(3,5),(4,9),(2,1),(5,2)。

輸入

輸入包含多組測試資料。輸入的第一行是一個整數T,表示測試資料的個數。
每個測試例兩行:
第一行是一個整數n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2個整數,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,這些數均不大於10000,其中li和wi表示第i根木棒的長度和重量。

輸出

輸出以分鐘為單位的最少準備時間。

樣例輸入

3 
5 
4 9 5 2 2 1 3 5 1 4 
3 
2 2 1 1 2 2 
3 
1 3 2 2 3 1

樣例輸出

2
1
3

提示

分析:先按照長度進行排序,然後向下遍歷,符合條件的不管並且標記,這樣在下一次遍歷的時候標記的點就不會訪問,保證了效率的同時保證了正確性。

#include <bits/stdc++.h>

using namespace std;

const int SIZE=5005;

struct node
{
    int wei;
    int l;
};

node a[SIZE];

bool cmp(node a,node b)
{
    if(a.l!=b.l)
    {
        return a.l<b.l;
    }

    else
    {
        return a.wei<b.wei;
    }
}
int main()
{

    int t;

    cin>>t;

    int n;

    while(t--)
    {
        cin>>n;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&a[i].l,&a[i].wei);
        }

        sort(a,a+n,cmp);

        int cnt=0;

        for(int i=0; i<n; i++)
        {
            if(a[i].wei) //避免重複的訪問
            {
                cnt++;
                int record=a[i].wei;

                for(int j=i+1; j<n; j++)
                {
                    if(a[j].wei>=record)
                    {
                        record=a[j].wei;
                        a[j].wei=0; //這個點已訪問
                    }
                }
            }

        }

        cout<<cnt<<endl;

    }
    return 0;
}