1. 程式人生 > >NYOJ 貪心演算法 236 心急的C小加

NYOJ 貪心演算法 236 心急的C小加

心急的C小加

時間限制:1000 ms  |  記憶體限制:65535 KB

難度:4

描述

C小加有一些木棒,它們的長度和質量都已經知道,需要一個機器處理這些木棒,機器開啟的時候需要耗費一個單位的時間,如果第i+1個木棒的重量和長度都大於等於第i個處理的木棒,那麼將不會耗費時間,否則需要消耗一個單位的時間。因為急著去約會,C小加想在最短的時間內把木棒處理完,你能告訴他應該怎樣做嗎?

輸入

第一行是一個整數T(1<T<1500),表示輸入資料一共有T組。
每組測試資料的第一行是一個整數N(1<=N<=5000),表示有N個木棒。接下來的一行分別輸入N個木棒的L,W(0 < L ,W <= 10000),用一個空格隔開,分別表示木棒的長度和質量。

輸出

處理這些木棒的最短時間。

樣例輸入

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

這道題和導彈攔截問題很像,我基本就是用的導彈攔截問題的思路寫的這道題。

稍微的變動就是這道題我用到了結構體,主要這道題的特點是他有兩個比較物件,一個是長度,一個是重量,所以利用結構體,寫一個sort函式,首先將所有的木棒進行從小到大排序,先比較長度,長度相同則比較重量。然後開闢一個二維陣列b[i][j],這裡的j是個固定值0,也就是b[i][0],用來表示當前加工木棒的重量,因為我們優先考慮的是木棒的長度來排序其次是重量,所以排序後的木棒我們只需比較他們的重量就可以了。如果第i+1個木棒的重量比第i個木棒的重量大或者相等,我們就更新當前加工的重量,如果第i+1個木棒的重量小於第i個木棒,這表示我們此時需要增加i的值,表示需要再花一單位的時間。這樣最後我們只需輸出i的大小,便是所需時間。

 
#include <iostream>
#include <algorithm>
#include<stdio.h>
using namespace std;
struct slect{
    int l;
    int w;
}a[5000];
bool compare(slect a,slect b)
{
    if(a.l < b.l) return true;
	else if(a.l == b.l && a.w< b.w) return true;
	else return false;

}
int main()
{
    int t,n,i,j,b[5000][1];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        scanf("%d %d",&a[i].l,&a[i].w);
        sort(a,a+n,compare);
        b[0][0]=a[0].w;
        int ans=1;
        for(i=1;i<n;i++)
        {   int kpl=0;
            for(j=0;j<ans;j++)
            {
                if(a[i].w>=b[j][0])
            {
                b[j][0]=a[i].w;
                kpl=1;
                break;
            }
            }
            if(kpl==0)
            {
                b[ans][0]=a[i].w;
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}