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

題意:你最多可以喫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);                
     } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章