【OpenJ_Bailian - 4110】圣诞老人的礼物-Santa Clau’s Gifts (贪心)
圣诞老人的礼物-Santa Clau’s Gifts
Descriptions:
圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多能带走多大价值的糖果。
Input
第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。
Output
输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
Sample Input
4 15 100 4 412 8 266 7 591 2
Sample Output
1193.0
题目链接;
https://vjudge.net/problem/OpenJ_Bailian-4110
这题比较水,就一个地方,求出每个礼物的平均价值,按照平均价值从大到小的顺序带走礼物即可
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define ME0(x) memset(x,0,sizeof(x)) using namespace std; struct gift{ double v,w; //定义按照v/w的大小进行排序,v/w大的优先,即礼物的平均价值大的优先 bool operator < (const gift &c) const { return v/w-c.v/c.w > eps; } }; gift a[105]; int n; double W;//驯鹿承担的最大重量 double sum=0;//带走的礼物的最大价值 int main() { cin>>n>>W; for(int i=0; i<n; i++)//输入 cin>>a[i].v>>a[i].w; sort(a,a+n);//排序 for(int i=0; i<n; i++) { //判断如果当前可承担重量比这一整箱礼物的重量大,就全部拿走,可承担重量减少 if(W>=a[i].w) { sum+=a[i].v; W-=a[i].w; } //判断如果当前可承担重量比这一整箱礼物的重量小,就拿走可承担重量的礼物,可承担重量减为0 else if(W<a[i].w) { double t=(a[i].v/a[i].w)*W; sum+=t; W=0; } else if(W==0)//可承担重量谓0,即不能拿礼物了,退出循环 { break; } } printf("%.1lf\n",sum); }