題目描述
在小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 每個機房的學生數量不同...