题目1399:名侦探柯南
题目描述:
大家一定都看过《名侦探柯南》,我最开始看的是小说版本的,后来出了漫画版本,现在又有了动画片的版本。
引用彪叔的一条飞信:做男人就要做柯南。变得了正太,飚的到女声;学得好化学,射的了麻醉;踢得好足球,玩得好极限;破得了大案,干得过黑社会;开得了飞机,躲得过机枪;停得了爆炸,引得了雪崩,最牛的是有一个十几年只见了他几面却依旧死心踏地念念不忘的好女友。
好了,书归正传,现在,柯南又遇到了一个棘手的案子:一个贵族的家里被盗。这个贵族的家里非常有钱,但这家主人的习惯很怪异,他将所有的金银珠宝都磨成粉装到几个分开的袋子里。由于之前并没有记录,所以主人并不知道这次被盗自己损失了多少钱。几天后,盗窃犯被抓住,但是他身上仅有一个盗窃时用的包,盗窃走的财产早已经挥霍一空。很显然,盗窃犯一定会使自己偷走的东西的总价值最大,柯南虽然断案如神,但是他却无法计算出盗窃犯到底盗走了价值多少钱的东西。你能帮帮柯南吗?
输入:
每组测试数据可能有多组输入,对于每一组输入:
输入的第一行包括两个整数N(1<=N<=100000),代表主人所拥有的被磨成分粉的珠宝的种类数。以及C(1<=N<=100000),代表盗窃犯盗窃时所用的包的容量。
接下来的N行,每行包括两个数W(1<=W<=10000000) 以及V(1<=V<=10000000),分别代表一类珠宝粉的总重量,以及这类珠宝粉的总价值。
输出:
输出盗窃所盗走物品的总价值。
样本数入:
2 10
4 12
8 16
样本输出:
24
提示:
若最后得到的被盗物品的总价值不是整数,请你将答案四舍五入后输出。
Notice:
1、所谓“每种物品”是幌子,其实每种物品仅有一件。
2、注意贪心与背包的区别:
这道题类似fat mouse trade,即可以取非整数件物品,所以按单价排序,依次拿一件,直到容量不够了选非整数件,贪心即可。而背包必须选整数件物品。
3、最后要求四舍五入。
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
#define N 100001
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define eps 1e-7
int n;
double c;
double g[N][3];
int comp(const void *a, const void *b)
{
return *((double *)b+2)>*((double *)a+2)?1:-1;
}
int main()
{
while(scanf("%d%lf",&n,&c)!=EOF)
{
int i,j;
for(i=0; i<n; i++)
{
scanf("%lf%lf",&g[i][0],&g[i][1]);
// 珠宝单位价值
g[i][2]=g[i][1]/g[i][0];
}
qsort(g,n,sizeof(double)*3,comp);
double sum=0;
for(i=0; i<n; i++)
{
if(c>=g[i][0])
{
c-=g[i][0];
sum+=g[i][1];
}
else
{
sum+=g[i][1]*c/g[i][0];
break;
}
}
printf("%d\n",(int)(sum+0.5));
}
}