uva - 12325(二分复杂度做题)

本文介绍了一种通过遍历不同组合来寻找最优价值分配方案的算法。该算法适用于两种类型的资源,通过调整每种资源的使用数量来最大化总价值。文章通过具体实现展示了如何根据不同条件选择最优解,并提供了完整的代码示例。
#include <map>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int lim = 110000;
LL s1,v1,s2,v2,n;
int main()
{
    int T,kase=1;
    scanf("%d",&T);
    while(T--){
        cin>>n>>s1>>v1>>s2>>v2;
        LL res = 0;
        if(n/s1 <= lim){
              int num = n/s1;
              for(int i = 0 ;i <= num;i++){
                  LL ans = v1*i;
                  int V = n - s1*i;
                  ans += (V/s2)*v2;
                  res =max(res,ans);
              }
        }
        else if(n/s2 <= lim){
              int num = n/s2;
              for(int i = 0 ;i <= num;i++){
                  LL ans = v2*i;
                  int V = n - s2*i;
                  ans += (V/s1)*v1;
                  res =max(res,ans);
              }
        }
        else {
             if(s2*v1 >= s1*v2){
                  for(int i=0;i<s1;i++) {
                     LL ans = v2*i;
                     int V = n - s2*i;
                     ans += (V/s1)*v1;
                     res =max(res,ans);
                  }
             }
             else {
                   for(int i=0;i<s2;i++) {
                     LL ans = v1*i;
                     int V = n - s1*i;
                     ans += (V/s2)*v2;
                     res =max(res,ans);
                  }
             }
        }
        cout<<"Case #"<<kase++<<": "<<res<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值