51NOD 1548 歐姆諾姆和糖果
阿新 • • 發佈:2019-01-29
1548 歐姆諾姆和糖果
題目來源: CodeForces
基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級演算法題 收藏 關注
一天,歐姆諾諾姆來到了朋友家裡,他發現了許多糖果。有藍色和紅色兩種。他知道每顆紅色糖果重Wr克,每顆藍色糖果重Wb克。吃一顆藍色糖果會給他帶來Hb的歡樂值,吃一顆紅色糖果會給他帶來Hr的歡樂值。
歐姆諾姆最多隻能吃C克的糖果,而且每一顆糖果不能只吃一半。現在他想通過吃藍色和紅色的糖果來獲得最大的歡樂值。
樣例解釋:每一種糖果吃兩顆即可。
Input
單組測試資料。
輸入佔一行有四個整數C,Hr,Hb,Wr,Wb (1≤C,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;
}