UOJ 495 新年的促銷

2022-03-26 19:00:37 字數 1098 閱讀 5038

題目

當了數天的快樂頹廢人,之後就啥也不會了;

有乙個簡單的dp,設\(dp_\)表示前\(i\)個物品,花費了\(j\)元,購買了\(k\)個,白嫖了\(p\)個;轉移的話考慮當前物品是買、白嫖、還是不買也不嫖;複雜度是\(o(n^3m)\)的,顯然過不去;

考慮對於一組物品,我們如何判斷用一定錢數是否能買下它們;

顯然我們需要按照**排序,之後先買便宜的物品,能買多少就盡量買多少;買到不能買了,再康康能否把剩下的物品全部白嫖即可;

即按照**排序從小到大排序之後最優方案存在一點\(k\),滿足\(i\leq k\)的物品,都是買或不買;對於\(i>k\)的物品,都是白嫖或不嫖;

於是簡單搞兩個dp,\(f_\)表示前\(i\)個物品花\(j\)元買\(k\)個的最大收益,\(g_\)表示從\(i\)到\(n\)物品中價值前\(j\)大的物品價值和;我們列舉一下分界點\(k\)就好了;

**

#include#define re register

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

inline int read()

const int maxn=305;

struct stha[maxn];

inline int cmp(const sth &a,const sth &b)

int n,m,a,b;

int g[maxn][maxn],dp[2][maxn][1005],ans[1005];

int main()

int o=0;

memset(dp,-20,sizeof(dp));

dp[0][0][0]=0;

for(re int i=1;i<=n;i++,o^=1)

for(re int j=0;j<=i;++j)

} for(re int i=1;i<=m;i++) printf("%d ",ans[i]=max(ans[i],ans[i-1]));puts("");

return 0;

}

uoj 176 新年的繁榮

給出乙個完全圖,邊權為兩點權值的and,求最大生成樹。這題用最小生成樹的boruvka演算法。大概就是每次找到每乙個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩乙個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。那麼這題相當於每個點有不同顏色,要找到每個點的異色點中最大的and值。扔...

uoj 175 新年的網警

在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在乙個叫做 universal oj 使用者群 的 qq 群中有人在散播 開 謠言 車 於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。這個使用者群中有 nn 個人,這些人中存在 mm 對雙向的直接認識關係,...

UOJ 351 新年的葉子

給出一棵樹,每次隨機選擇乙個葉子節點 可以重複選 將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。這題的主要思路是用總代價除以總方案數。樹的直徑有乙個或兩個必經點,當直徑長度為奇數時,直徑的中點即為必經點,可以將有希望成為直徑上的葉子節點根據它屬於必經點的哪棵子樹進行分類,得到多個葉子集...