NYOJ824--Greedy Mouse

本文介绍了一道关于贸易策略的问题,通过给定的资源进行最优交换以获得最大收益。问题中涉及了多个房间,每个房间内有不同的物品价值及交易成本,目标是利用有限的资源获取尽可能多的目标物品。

描述

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

思路

胖老鼠准备英镑的猫粮,准备与猫的贸易保护仓库包含他最喜欢的食物:花生。仓库有N个房间。第i个房间containsW[i]磅的花生,需要F[我]磅的猫粮。胖老鼠不必对所有房间里的花生贸易,相反,他可能会得到W[i]%磅的花生如果他支付F[i] %磅的猫粮。胖老鼠是一个愚蠢的鼠,所以你能告诉他可以获得最大的花生。
先把性价比高的保住!!

AC-Code

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

class Thing implements Comparable<Thing>{
	private double w;
	private double f;
	public double getW() {
		return w;
	}
	public void setW(double w) {
		this.w = w;
	}
	public double getF() {
		return f;
	}
	public void setF(double f) {
		this.f = f;
	}
	public int compareTo(Thing o) {
		double a1 = this.w/this.f;
		double a2 = o.w/o.f;
		if(a1<a2)
		{
			return 1;
		}
		else {
			return -1;
		}
    }
}
public class ACM824 {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		while(true) {
			int m = sc.nextInt();
			int n = sc.nextInt();
			if((m!=-1&&n!=-1)) 
			{
				ArrayList<Thing> list =new ArrayList<Thing>();
				for(int i = 0;i<n;i++) 
				{
					Thing t = new Thing();
					t.setW(sc.nextDouble());
					t.setF(sc.nextDouble());
					list.add(t);
				}
				Collections.sort(list);
				double s=0;
				for (Thing thing : list) {
					if(m>0) {
						if(thing.getF()<=m) {
							s+=thing.getW();
							m-=thing.getF();
						}
						else {
							s+=m*(thing.getW()/thing.getF());
							m=0;
						}
					}
					else {
						break;
					}
				}
				System.out.println(String.format("%.3f", s));
			}
			else {
				break;
			}
		}
		sc.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值