码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 526C - Om Nom and Candies(贪心,暴力)

时间:2015-05-21 10:55:18      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

题意:你最多可以吃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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!