程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uvalive 2322 Wooden Sticks(貪心)

uvalive 2322 Wooden Sticks(貪心)

編輯:C++入門知識

題目大意:給出要求切的n個小木棍 , 每個小木棍有長度和重量,因為當要切的長度和重量分別大於前面一個的長度和重量的時候可以不用調整大木棍直接切割, 否則要進行調整。現在要求求出一個序列, 使得調整的次數最少, 輸出調整的次數。   解題思路:將n個小木棍先按照 長度和重量的大小排序,然後按照順序將小木棍分堆,可入堆的要求是長度和重量大於當前這個堆的長度和重量,入堆之後, 要將新的木棍的屬性賦值個這個堆, 如果當前所有堆都沒法放下這個木棍, 就得單獨放成一個堆。最後的堆數就是要求的調整次數。    

#include <stdio.h>  
#include <string.h>  
#include <algorithm>  
using namespace std;  
const int N = 5005;  
  
struct stick {  
    int len;  
    int wei;  
}tmp[N], rec[N];  
  
bool cmp(const stick& a, const stick& b) {  
    if (a.len != b.len)  
    return a.len < b.len;  
    else  
    return a.wei < b.wei;  
}  
  
int main() {  
    int cas, n, cnt, begin;  
    scanf("%d", &cas);  
    while (cas--) {  
    cnt = 0;  
    memset(tmp, 0, sizeof(tmp));  
    memset(rec, 0, sizeof(rec));  
  
    scanf("%d", &n);  
    for (int i = 0; i < n; i++)  
        scanf("%d %d", &tmp[i].len, &tmp[i].wei);  
  
    sort(tmp, tmp + n, cmp);  
  
    for (int i = 0; i < n; i++) {  
        int flag = 1;  
        for (int j = 0; j < cnt; j++) {  
        if (tmp[i].len >= rec[j].len && tmp[i].wei >= rec[j].wei) {  
            rec[j] = tmp[i];  
            flag = 0;  
            break;  
        }  
        }  
  
        if (flag)   rec[cnt++] = tmp[i];  
    }  
    printf("%d\n", cnt);  
    }  
    return 0;  
}  

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved