小Z的 AK 計畫 洛谷p2147

2021-08-07 04:57:12 字數 1575 閱讀 5428

題目描述

在小z的家鄉,有機房一條街,街上有很多機房。每個機房裡都有一萬個人在切題。小z剛刷完codechef,準備出來逛逛。

機房一條街有 n 個機房,第 i 個機房的座標為 xi ,小z的家座標為 0。小z在街上移動的速度為1,即從 x1 到 x2 所耗費的時間為 |x1 − x2|。每個機房的學生數量不同,acm 題目水平也良莠不齊。小z到達第 i 個機房後,可以花 ti 的時間想題,然後瞬間 ak;當然,也可以過機房而不入。

小z現在只有 m 個單位時間,之後他就該趕著去打 codeforces 了。現在他想知道自己最多能在多少個機房 ak,希望你幫幫他。

輸入輸出格式

輸入格式:

第一行包含兩個整數 n,m。

接下來 n 行,每行包含兩個整數 xi,ti 。

輸出格式:

第一行包含乙個整數,表示小z最多能 ak 的機房數量。

輸入輸出樣例

輸入樣例#1:

2 10

1 100

5 5輸出樣例#1:

說明【資料規模】

對於 30% 的資料,n ≤ 20。

對於 60% 的資料,n ≤ 1000。

對於 100% 的資料,1 ≤ n ≤ 10^5,0 ≤ m,xi ≤ 10^18,0 ≤ ti ≤ 10^9。

設二元組f[i]表示當前走到了第i個機房時,剩餘多少時間,最多能ak多少題,sta表示選擇ak的機房的集合(包括第i個),定義二元組運算,狀態轉移方程為:

表示如果時間本身就夠,那麼x可為空集,|x|=0,ak的題就加1,如果時間不夠,那就需要在已選擇ak的機房中去掉一部分來騰出時間,ak的題的數量就加上(1-去掉的機房數),在二元組運算過程中,剩餘時間要保證》=0,最後答案為f[i]在i取1~n中的最大值,可是每次轉移的代價太大,因此考慮優化。

由於每個機房都只能ak一次,所以考慮貪心,每次去掉耗時最大的機房,直到時間不超,這樣可以用堆來維護選擇ak的機房集合。

因為每個機房只會進堆一次出堆一次,所以時間複雜度為o(nlogn)。

#include

#include

#define f(i,l,r) for(i=(l);i<=(r);i++)

using

namespace

std;

const

int maxn=100005;

struct bar

heap[p]=a;

}inline

void pushdown(int p)

heap[p]=a;

}inline

void insert(int a)

inline

void pop()

int main()

sort(a+1,a+1+n);

f(i,1,n)

else

ans=max(ans,sz); //更新答案 }}

cout

0; }

洛谷P2107 小Z的AK計畫

題目大意 有 n 個物品,第 i 個物品在 p i 大小為 w i 你在 0 要求移動距離加上大小總和小於 m 問你最多可以拿多少物品 題解 貪心,按距離排序,每次遇到乙個物品就把大小加入乙個大根堆,若堆中元素大小和加上距離大於 m 就把最大值刪去,直到符合 卡點 無 c code include ...

小Z的AK計畫

洛谷鏈結 在小z的家鄉,有機房一條街,街上有很多機房。每個機房裡都有一萬個人在切題。小z剛刷完codechef,準備出來逛逛。機房一條街有 n 個機房,第 i 個機房的座標為 xi 小z的家座標為 0。小z在街上移動的速度為1,即從 x1 到 x2 所耗費的時間為 x1 x2 每個機房的學生數量不同...

小Z的AK計畫

洛谷鏈結 在小z的家鄉,有機房一條街,街上有很多機房。每個機房裡都有一萬個人在切題。小z剛刷完codechef,準備出來逛逛。機房一條街有 n 個機房,第 i 個機房的座標為 xi 小z的家座標為 0。小z在街上移動的速度為1,即從 x1 到 x2 所耗費的時間為 x1 x2 每個機房的學生數量不同...