题目详情:点击打开链接
题目分析:
本题应用贪心算法的思想,首先将每种大米用结构体存储单价和斤数,再按照单价升序排序,遍历排序后的结构体数据,不断累加资金和斤数,若资金大于总的资金,则减去当前大米的累加值,将剩余资金买当前大米的一部分。
AC代码如下:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#include <list>
#include <deque>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>
#include <memory.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#define ll long long
using namespace std;
struct Rice
{
int p; //单价
int h; //斤数
};
int main()
{
Rice r[1001];
int C;
int n, m;
cin >> C;
while(C--)
{
cin >> n >> m;
for(int i = 0; i< m; i++)
cin >> r[i].p >> r[i].h;
for(int i = 0; i < m-1; i++)
for(int j = i+1; j < m; j++)
if(r[i].p > r[j].p)
swap(r[i], r[j]);
int i ;
double ans = 0;
int money = 0;
for(i = 0; i < m; i++)
{
money += r[i].p * r[i].h;
if(money > n)
break;
ans += r[i].h;
}
ans += (double)(n - (money - r[i].p * r[i].h)) / r[i].p;
printf("%.2lf\n", ans);
}
return 0;
}