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

UVALive - 2326 Moving Tables 貪心

編輯:C++入門知識

UVALive - 2326 Moving Tables 貪心


題目大意:有400個箱子,奇數的箱子在北邊,偶數的箱子在南邊,每個箱子的大小都一樣。北邊和南邊之間有一條走廊,走廊的寬度剛好是一個箱子的寬度。
現在有M個移動操作,工人每次移動箱子需要10分鐘(你有無限個工人,因為有走廊的約束,不能有兩個箱子公用一段走廊)。問需要多少分鐘能把這些操作做完

解題思路:先將奇數的箱子和偶數的箱子做一下處理,避免1 3和4 6操作只需要10分鐘這種情況。輸入的時候要注意,輸入的第一個數有可能小於第二個數。

#include
#include
#include
using namespace std;
const int N = 210;
struct Room{
    int x, y;
}R[N];
int n, vis[N];

int cmp(const Room &a, const Room &b) {
    if(a.x == b.x) {
        return a.y > b.y;
    }
    else
        return a.x < b.x;
}

void init() {
    scanf("%d", &n);
    int x, y;
    for(int i = 0; i < n; i++) {
        scanf("%d%d", &x, &y);
        if(x > y) {
            int t = x;
            x = y;
            y = t;
        }
        R[i].x = x % 2 ? x : x - 1;
        R[i].y = y % 2 ? y : y - 1;
    }
    sort(R, R + n, cmp);
    memset(vis, 0, sizeof(vis));
}

int solve() {
    int cnt = 0;
    int mark = 0;
    while(1) {
        int l = -10;
        for(int i = 0; i < n; i++) {
            if(!vis[i] && R[i].x > l) {
                vis[i] = 1;
                l = R[i].y; 
                mark++;
            }
        }
        cnt++;
        if(mark == n)
            break;
    }
    return cnt * 10;
}

int main() {
    int test;
    scanf("%d", &test);
    while(test--) {
        init();
        printf("%d\n", solve());
    }
    return 0;
}

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