标签:
题意:你最多可以吃C千克的糖, 有两种糖,每种糖有两个参数,一个为重 w ,一个为欢乐度 h , 如何选择才能拥有最高的欢乐度, 两种糖数量不限。
题解:看了半天题解才理解如何做,
分为两种枚举政策涵盖了所有情况, 时间复杂度为sqrt(c),神奇的暴力
1。如果两种糖中重量最大的超过sqrt(c), 那么该糖最多也只能选择不超过sqrt(c)个, 直接枚举该糖个数,记录最大欢乐度
2。如果两种糖重量都小于sqrt(c),那么从性价比来考虑
我们可以买到Wb个a糖果的同时也可以将其换作Wa个b糖果
但是有不等式可以知道明显我们不会选择买超过Wb以上的a糖果,而是将其换作Wa的b糖果
有此可以知道我们可以枚举性价比低的糖果,且我们想到该糖果最大购买数量也是小于Wb的 时间复杂度为sqrt(c)
因此便有了改枚举
代码:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<cmath>
using namespace std;
void swaap(__int64 &a, __int64 &b)
{
__int64 t;
t = a, a = b, b = t;
}
int main()
{
__int64 c, h[3], w[3];
while(scanf("%I64d", &c) != EOF)
{
scanf("%I64d %I64d %I64d %I64d", &h[1], &h[2], &w[1], &w[2]);
if(w[2] > w[1]) swaap(w[2], w[1]), swaap(h[1], h[2]);
__int64 maxx = -1, sum = 0;
if(w[1] * w[1] >= c)
{
for(int i = 0; i <= c/w[1]; i++)
{
sum = i*h[1];
sum += ((c-i*w[1])/w[2] * h[2]);
if(maxx < sum) maxx = sum;
}
}
else
{
sum = 0;
if(((h[1]*1.0) / w[1]) > ((h[2]*1.0) / w[2])) swaap(h[1], h[2]), swaap(w[1], w[2]);
for(int i = 0; i <= w[2]; i++)
{
sum = i*h[1];
sum += ((c-i*w[1])/w[2] * h[2]);
if(maxx < sum) maxx = sum;
}
}
printf("%I64d\n", maxx);
}
}
Codeforces 526C - Om Nom and Candies(贪心,暴力)
标签:
原文地址:http://blog.csdn.net/q651111937/article/details/45887369