1. 程式人生 > >Codeforces 526C.Om Nom and Candies

Codeforces 526C.Om Nom and Candies

超過 style else lan include 一個 print div swap

題目描述

一個只有兩個物品的背包問題,但是範圍都是1e9,需要考慮根號或者log的復雜度。

如果這兩個物品中的某一個花費超過了根號C,那麽我們可以直接枚舉這件物品的數量,另一件物品的數量可以計算得出。

若沒有

  假設 v1/c1>v2/c2 也就是v1*c2>v2*c1

  假設第一件物品有c2件,也就是耗費了c1*c2的空間得到了v1*c2的價值,若用這c1*c2的空間選c1個價值為v2的物品,根據上面的不等式可以看出這是不憂的。

  所以第二件物品的數量不會超過c1件。

#include<complex>
#include<cstdio>
using
namespace std; long long m,c1,c2,v1,v2,ans; int main() { scanf("%d%d%d%d%d",&m,&v1,&v2,&c1,&c2); if(c2>c1)swap(c1,c2),swap(v1,v2); if(c1>=sqrt(m)) for(int i=0;i*c1<=m;i++) ans=max(ans,i*v1+(m-i*c1)/c2*v2); else {
if(v1*c2<v2*c1)swap(c1,c2),swap(v1,v2); for(int i=0;i<c1 && i*c2<=m;i++) ans=max(ans,i*v2+(m-i*c2)/c1*v1); } printf("%lld\n",ans); return 0; }

Codeforces 526C.Om Nom and Candies