題目描述
lyk出了道水題。
這個水題是這樣的:有兩副牌,每副牌都有n張。
對於第一副牌的每張牌長和寬分別是xi和yi。對於第二副牌的每張牌長和寬分別是aj和bj。第一副牌的第i張牌能覆蓋第二副牌的第j張牌當且僅當xi>=aj並且yi>=bj。(注意牌不能翻轉)當然一張牌只能去覆蓋最多一張牌,而不能覆蓋好多張。
lyk想讓兩副牌的各n張一一對應疊起來。它想知道第二副牌最多有幾張能被第一副牌所覆蓋。
輸入格式(water.in)
第一行乙個數n。
接下來n行,每行兩個數xi,yi。
接下來n行,每行兩個數aj,bj。
輸出格式(water.out)
輸出乙個數表示答案。
輸入樣例
2 35 7
6 84 1
2 53 4
輸出樣例
資料範圍
對於50%的資料n<=10。
對於80%的資料n<=1000。
對於100%的資料1<=n<=100000,1<=xi,yi,aj,bj<=10^9。
分析:一眼貪心題,覆蓋的兩張牌肯定是要讓它們的x,y的差值盡量小才是最優的,因為這樣就把更多的選擇留給了其它的牌.那麼先把所有牌按照x從小到大排序,然後在第二副牌中把a[j] <= x[i]的牌的b放進乙個multiset中,每次取與y[i]最相近的乙個b值即可.
multiset是乙個可重複的set,裡面的元素都是排好序的,upper_bound的返回看multiset中數的情況而定,如果upper_bound(a[i]),multiset中存在了a[i],就返回所有a[i]中最後面乙個的迭代器,如果不存在,就返回第乙個大於a[i]的迭代器,因為要求<=的嘛,方便起見迭代器減一下就好了.
#include #include#include
#include
#include
using
namespace
std;
struct
node
a[100010],b[100010
];int
n, k, ans;
bool
cmp(node a, node b)
intmain()
multiset
::iterator it =s.upper_bound(a[i].y);
if (it ==s.begin())
continue
; it--;
s.erase(it);
ans++;
}printf(
"%d\n
", ans);
return0;
}
NOIP模擬 水管(水題)
為什麼打了endl竟然沒t。但為什麼交到 上又t了 氵題嘛,做法有很多種啊。我選擇加n 1條邊,這樣就保證了聯通,直接dfs一遍記錄兒子,邊權就是兒子的值,注意修改反向邊。然後一群人拿著我的程式去比誰跑得快 includeusing namespace std const int maxn 2e5 ...
水(NOIP模擬賽Round 10)
題目描述 小z有乙個長度為 的數列。他有 次令人窒息的操作,每次操作可以使某個數字 或。他當然是希望這些數字的乘積盡量小了。為了簡化題目,你只需輸出操作完成後的數列即可。我是分割線 這道題目,我們可以先自己手動模擬一遍,就能發現,首先我們需要盡量讓乘積最小,那麼首先我們希望乘積為負數,所以假設一開始...
俄羅斯方塊(NOIP模擬賽)(水 模擬)
真是一道神奇的題目233 原題傳送門 迫不得已貼了個題解的鏈結。好吧,這道題就是分情況討論,純模擬,沒有什麼難的。腦洞要大,四面都要考慮,不能漏 include include using namespace std intc,p,ans int l 101 int absq int a,int b...