ACM Greedy Mouse

OpenSoucre發表於2014-04-09

Greedy Mouse

時間限制:1000 ms  |  記憶體限制:65535 KB
難度:3
 
描述

A fat mouse prepared M pounds of cat food,ready to trade with the cats guarding the warehouse containing his

favorite food:peanut. The warehouse has N rooms.The ith room containsW[i] pounds of peanut and requires 

F[i] pounds of cat food. Fatmouse does not have to trade for all the peanut in the room,instead,he may get 

 W[i]*a% pounds of peanut if he pays F[i]*a% pounds of cat food.The mouse is a stupid mouse,so can you tell 

him the maximum amount of peanut he can obtain.

 
輸入
The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers W[i] and F[i] respectively. The test case is terminated by two -1. All integers are not greater than 1000.
輸出
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of penaut that FatMouse can obtain.
樣例輸入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
樣例輸出
13.333
31.500
基本的揹包問題,用貪心求解
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <utility>
using namespace std;
typedef pair<double,double> W;
bool cmp(const W& a,const W& b){ return a.first > b.first;}
int main(){
    double m;
    int n;
    while(cin >>  m >> n && m!=-1 && n!=-1){
        vector<W> exchange(n);
        for(int i = 0 ; i < n; ++ i){
            double w,f;
            cin >>w >>f;
            exchange[i].first = w/f;
            exchange[i].second = w;
        }
        sort(exchange.begin(),exchange.end(), cmp);
        double res = 0;
        for(int i = 0 ; i < n && m; ++i){
            if(m > exchange[i].second/exchange[i].first){
                res += exchange[i].second;
                m -= exchange[i].second/exchange[i].first;
            }else{
                res+=m*exchange[i].first;
                break;
            }
        }
        printf("%0.3f\n",res);
    }
}

 

 

相關文章