【题解】FatMouse‘ Trade

题目链接:https://acm.sdtbu.edu.cn/vjudge/contest/view.action?cid=2479#problem/A

很水的水题,因为每次做都会莫名其妙载个跟头,一时半会还看不出来。看来是有bear来,搞偷袭hhh

题意: 给定n个房间和m个金币,每个房间有J[i]个奶酪,但是要用F[i]个金币购买。问最多可以得到多少奶酪?答案是个实数。
思路: 贪心,根据性价比排序。
ps: 我们在排序时是用实数排序的,后面在计算奶酪的时候很容易用之前算出的单价来乘金币个数,但是这样是不对的,因为用整数得到实数已经有了数据损失,再乘回去数据损失会更大。只有最后金币不够买一整个房间的奶酪时才可以这么做。
AC代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<set>
#include<map>

using namespace std;
const int N = 1010,INF=0x3f3f3f3f;
typedef pair<int, int> PII;
typedef long long ll;

int n, m;
pair<double,PII> p[N];
int main()
{
	while (cin >> m >> n && (n !=-1 && m !=-1))
	{
		for (int i = 0; i < n; ++i)
		{
			cin >> p[i].second.first >> p[i].second.second;
			p[i].first = p[i].second.first / (double) p[i].second.second;
		}

		sort(p, p + n);

		double sum = 0;
		for (int i = n-1; i >= 0; --i)
		{
			if (m >= p[i].second.second)
			{
				sum += (double)p[i].second.first;
				m -= p[i].second.second;
			}
			else
			{
				sum += (double) m * p[i].first;
				break;
			}
		}

		printf("%.3lf\n", sum);
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值