1. 程式人生 > >UVa 11134 Fabled Rooks(貪心+優先佇列)

UVa 11134 Fabled Rooks(貪心+優先佇列)

題目連結

題目大意:

    在一個棋盤上,放置N個國際象棋的城堡,每個城堡給出可以放置的範圍,要求這些城堡不能相互攻擊到,求這些城堡的擺放方案。

解題思路:

    這題非常關鍵的一點就是橫縱座標可以分開獨立考慮。對於每一個方向,我們維護一個下限小(其次上線小)的區間優先出堆的堆,以及當前要填充的座標。每次去堆頂區間。如果上限小於要填充座標說明無法填充。如果下限小於當前要填充座標,更新下限,否則取下限和要填充座標進行填充,並且更新要填充座標。就這樣從小到大不斷填充,直至所有區間填充完畢。

AC程式碼:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int maxn=5000+3;

struct Node
{
    int l,r,id;//下限、上限、編號
    bool operator<(const Node &other)const//下限小的優先出堆,其次考慮上限小的
    {
        if(l!=other.l)
            return l>other.l;
        else return r>other.r;
    }
}node[2][maxn];

int N,ans[2][maxn];

bool solve(int x)
{
    priority_queue<Node> que;
    for(int i=0;i<N;++i)
        que.push(node[x][i]);
    int now=0;
    while(!que.empty())
    {
        Node tmp=que.top(); que.pop();
        if(tmp.r<now)//區域內所有座標都已使用,無法放置
            return false;
        if(tmp.l<now)//更新下限
        {
            tmp.l=now;
            que.push(tmp);
        }
        else//放置棋子
        {
            int put=max(now,tmp.l);
            ans[x][tmp.id]=put;
            now=put+1;
        }
    }
    return true;
}

int main()
{
    while(~scanf("%d",&N)&&N)
    {
        for(int i=0;i<N;++i)
        {
            scanf("%d%d%d%d",&node[0][i].l,&node[1][i].l,&node[0][i].r,&node[1][i].r);
            node[0][i].id=i;
            node[1][i].id=i;
        }
        if(solve(0)&&solve(1))//橫縱座標都有解
            for(int i=0;i<N;++i)
                printf("%d %d\n",ans[0][i],ans[1][i]);
        else puts("IMPOSSIBLE");
    }
    
    return 0;
}


相關推薦

UVa 11134 Fabled Rooks貪心優先佇列

題目連結 題目大意:     在一個棋盤上,放置N個國際象棋的城堡,每個城堡給出可以放置的範圍,要求這些城堡不能相互攻擊到,求這些城堡的擺放方案。 解題思路:     這題非常關鍵的一點就是橫縱座標可以分開獨立考慮。對於每一個方向,我們維護一個下限小(其次上線小)的區間

UVA 11134 Fabled Rooks貪心的妙用+memset誤用警示

\n UC 錯誤 百度 函數傳參 用法 min 開始 != 題目鏈接: https://cn.vjudge.net/problem/UVA-11134 1 /* 2 問題 輸入棋盤的規模和車的數量n(1=<n<=5000),接著輸入n輛車的所能在的矩陣

白書訓練計劃UVa 11134 Fabled Rooks貪心

這題因為行與列是無關的,互無影響的。所以可以將行或列分開來計算。這就相當於轉化成了在期間[1,n]內選擇n個不同的整數,使得第i個整數在閉區間[Li,Ri]內。這就轉換成了一個貪心問題了。但是注意不能先按照左端點排序,再按右端點排序,然後儘量往左邊放,比如,(1,1),(

UVA 11134 Fabled Rooks貪心+問題分解】

題意: 在一個n*n的棋盤中放置 n個棋子,每個棋子有固定的放置範圍,在滿足放置範圍的情況下,放置的棋子橫向和縱向不能有第二個棋子;輸出棋子的放置位置或者 impossible; 思路: 解這題的關鍵就是問題的分解,如果能想到問題的分解方法的話,就比較容易做了;因為

Uva 11134 Fabled Rooks平面區間選點

由於它是平面選點,可以將它確定矩形的對角座標x1,y1,x2,y2,,拆成x軸座標x1,y1 和y軸座標x2,y2; 然後分別對x軸和y軸區間選點,只要兩個都可以選完,那就說明在它確定的平面上也是可以選出的。需注意輸出時還要還原順序輸出。 import java.util.

Codeforces Round #390 (Div. 2)(A,B,C(記憶化搜尋),D貪心優先佇列)

/* Codeforces Round #390 (Div. 2) 時間: 2017/02/16 A. Lesha and array splitting 題意:將集合分成幾個小集合,要求小集合的和不為0. 題解:遍歷過去,一直到不滿足集合並數字非0前生成一個集合 */ #

Expedition POJ 2431 貪心優先佇列

題面: A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

UVa 11134 - Fabled Rooks 優先隊列,貪心 難度: 0

所在 n皇後 時間 com pro 比較 php 現在 online 題目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am

11134-Fabled Rooks貪心 + 優先佇列 + 思想轉化】

這題主要學習了一下貪心的方法,和優先佇列priority_queue的使用 貪心策略就是 每次 左邊界 小的 並且 右邊界 小的出佇列,其次需要根據位置不斷更新左邊邊界值 #include<cstdio> #include<cstring> #inc

UVa 11134 Fabled Rooks 算法分析

端點 處理 我們 example lob problem 經典 一個點 本質 難度:β 用時:0 題目:?? 代碼:?? 這是一道區間貪心題。 題目都不用花心思建模了。要求相當明確。就是要把 n 個點放在 一個 n x n 的網格裏,要求點與點不能共行或共列,每個點

UVA11134 Fabled Rooks 傳說中的車

UVA-11134 Fabled Rooks 傳說中的車 剛開始時想直接用回溯法過,試了兩種回溯方法都超時了。 後來用貪心法寫了一遍,老是WA,卡了差不多兩小時發現自己輸出中的IMPOSSIBLE寫成IMPOSSBILE了,改了之後就AC了。難受。 總的來說還是要注意細節。 對於題目

POJ 3190 Stall Reservations-奶牛分欄區間貪心優先佇列

題目大意:每一隻奶牛要求在時間區間[A,B]內獨享一個牛欄。問最少需要多少個牛欄。 貪心策略是優先滿足A最小的奶牛,維持一個牛欄B最小堆,將新來的奶牛塞進B最小的牛欄裡。 <p><span style="color: rgb(51, 51, 51);

二叉樹堆和優先佇列

堆是一種特殊的二叉樹。 最小值堆:最小值堆的特性。 對於堆的任意非葉節點K,K的值總是小於或者等於左右子節點。 K <= 左節點;K <= 又節點; 堆例項: 堆實際上是一個完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1)

201803-4 棋局評估動態規劃+優先佇列

試題編號: 201803-4 試題名稱: 棋局評估 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   Alice和Bob正在玩井字棋遊戲。   井字棋遊戲的規則很簡單:兩人輪流往3

Touch The Sky 氣球抉擇 優先佇列

題意: 你的飛艇有n個一次性氣球,開始你在海拔0m位置,每一個氣球有一個L和D,你在小於等於L的位置才可以使用這個氣球,使你的海拔上升D。問我最多可以使用幾個氣球 解析: 設A=L+D,對於兩個氣球x和y,他們的A為Ax和Ay。顯然當Ax<Ay時,我會優

CCF-CSP-2017-3-4 地鐵修建結構體優先佇列

題目:問題描述  A市有n個交通樞紐,其中1號和n號非常重要,為了加強運輸能力,A市決定在1號到n號樞紐間修建一條地鐵。  地鐵由很多段隧道組成,每段隧道連線兩個交通樞紐。經過勘探,有m段隧道作為候選,

中山紀念中學20170310洗衣服貪心優先隊列升序【pair】

long spa tor i++ 再次 記錄 當前 優先 mil #include<bits/stdc++.h>using namespace std;typedef pair<long long,int>clot;priority_queue<

洛谷4404 [JSOI2010]快取交換貪心優先佇列

題目 在計算機中,CPU只能和快取記憶體Cache直接交換資料。當所需的記憶體單元不在Cache中時,則需要從主存裡把資料調入Cache。此時,如果Cache容量已滿,則必須先從中刪除一個。 例如,當前Cache容量為3,且已經有編號為10和20的主存單元。 此時,CPU訪問編號為10的主存

Uva 10382 Watering Grass貪心區間覆蓋+

  n sprinklers are installed in a horizontal strip of grass l meters long andw meters wide. Each sprinkler is installed at the horizontal

D. Fedor and coupons貪心+優先佇列

Note In the first example if we take the first two coupons then all the products with ids in range [40, 70] can be bought with both coupons. There are