1270: Wooden Sticks [貪心]
時間限制: 1 Sec 內存限制: 128 MB提交: 31 解決: 11 統計
題目描述
Lialosiu要製作木棍,給n根作爲原料的木棍的長度和重量。根據要求求出製作木棍的最短時間。
首先我們知道製作第一個木棍需要1分鐘,若是接着要製作的木棍的重量和長度都不少於當前的木棍,那麼就不需要建立的時間,若是沒有,則再需要建立時間,也就是1分鐘。
舉個例子,如果你有五個原料木棍,他們的長度和重量分別是(4,9), (5,2), (2,1), (3,5), 和 (1,4), 那麼第一分鐘你要建立一根木棍作爲起始參照,比如(1,4)接下來(3,5)和(4,9)都可以不花費時間,然後用第二分鐘選取(2,1)這跟木棍作爲參照,接下來(5,2)可以不花費任何時間,總的來說,你一共花費了兩分鐘,這也是你可能使用的最少時間。
現在給了n個木棍的長度和重量,你能求出使用這些木棍的最少時間嗎?
輸入
首先,輸入一個正整數T ,代表有T組數據。
接下來,第二行你要輸入正整數n(1<=n<=5000)代表的你的原料木棍個數。
第三行你要輸入2*n 個 正整數l1, w1, l2, w2, ..., ln, wn,每一個數字都不超過10000 。 li代表第i根木棍的長度,wi代表第i根木棍的重量。
輸出
輸出一個整數,代表最少需要的時間t。
樣例輸入
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
來源
代碼實現:(AC代碼)
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- struct node{
- int l,w;
- }p[10005];
- int cmp(node a,node b)
- {
- if(a.l==b.l)
- return a.w<b.w;
- return a.l<b.l;
- }
- int main()
- {
- int t,n,i,j,k,v[10005],flag;
- cin>>t;
- while(t--)
- {
- long long sum=0;
- cin>>n;
- for(i=0;i<n;i++)
- cin>>p[i].l>>p[i].w;
- memset(v,0,sizeof(v));
- sort(p,p+n,cmp);
- v[0]=1;k=0;
- while(k<n)
- {
- ++sum;
- for(i=k+1,j=k,flag=1;i<n;++i)
- {
- if(v[i])
- continue;
- if((p[j].w<=p[i].w)&&(p[j].l<=p[i].l))
- {
- v[i]=1;
- j=i;
- }
- else
- {
- if(flag)
- {
- flag=0;
- k=i;
- }
- }
- }
- if(flag)
- break;
- }
- cout<<sum<<endl;
- }
- return 0;
- }
剛開始想的是把長度和重量合成一個整數,然後進行排序,然後再把那個數%10,求出個位數字,但是這樣想的話只是把重量當成個位數來處理,可以。如果是十位數字以上就不行了