noip模擬賽 水題

2022-05-01 07:54:11 字數 1352 閱讀 8013

題目描述

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...