1. 程式人生 > >51NOD 1548 歐姆諾姆和糖果

51NOD 1548 歐姆諾姆和糖果

1548 歐姆諾姆和糖果
題目來源: CodeForces
基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題 收藏  關注
一天,歐姆諾諾姆來到了朋友家裡,他發現了許多糖果。有藍色和紅色兩種。他知道每顆紅色糖果重Wr克,每顆藍色糖果重Wb克。吃一顆藍色糖果會給他帶來Hb的歡樂值,吃一顆紅色糖果會給他帶來Hr的歡樂值。
歐姆諾姆最多隻能吃C克的糖果,而且每一顆糖果不能只吃一半。現在他想通過吃藍色和紅色的糖果來獲得最大的歡樂值。
樣例解釋:每一種糖果吃兩顆即可。

Input
單組測試資料。
輸入佔一行有四個整數C,Hr,Hb,Wr,Wb (1C,Hr,Hb,Wr,Wb≤10
^9). Output 輸出最大可能獲得的歡樂值。 Input示例 樣例輸入1 10 3 5 2 3 Output示例 樣例輸出1 16 System Message (題目提供者)

設nr nb 分別為吃紅/藍糖果的克數
如果wr>=sqrt(c)
那隻要列舉nr即可
wb>=sqrt(c)同理

wr<=sqrt(c)&&wb<=sqrt(c)
假設hb/wb <= hr/wr—>hb*wr <= hr*wb
如果nb >= wr
nb = x*wr + y
因為紅糖的價效比更高 如果將x*wr轉換為x個紅糖 得到歡樂值更高
所以nb<wr<=sqrt(c)

所以只需要列舉nb,nr 從0到sqrt(c) 取最大值即可

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<math.h> #include<list> #include<cstring> #include<fstream> #include<queue> #include<sstream> //#include<memory.h> using namespace std; #define ll long long #define ull unsigned long long #define pii pair<int,int> #define INF 1000000007 #define pll pair<ll,ll> #define pid pair<int,double> int main() { //freopen("/home/lu/Documents/r.txt","r",stdin); //freopen("/home/lu/Documents/w.txt","w",stdout); int c,hr,hb,wr,wb; while(~scanf("%d%d%d%d%d",&c,&hr,&hb,&wr,&wb)){ ll ans = 0; ll end = sqrt(c)+1; for(ll i=0;i<end;++i){ if(i*wr<=c){ ans = max(ans ,i*hr+(c-i*wr)/wb*hb); } if(i*wb<=c){ ans = max(ans ,i*hb+(c-i*wb)/wr*hr); } } printf("%lld\n",ans); } return 0; }