1283 最高得分(maxvalue)
时间限制:1000毫秒 内存限制:128MB
题目描述 Description
有块花圃中,满是各式各样闪闪发亮的字母水晶珠,卡卡西想要从这花圃中取出自己想要的字母水晶珠。卡卡西往右手边一看,有一个告示牌,上面写道:亲爱的朋友,如果你想从花圃中获取字母水晶珠,必须先完成如下游戏:
假设每种字母水晶珠的数量和总价值用(A,B)表示,其中A表示这种水晶珠总的数量,B表示所有这种水晶珠的总价值。例如一共有3种字母水晶珠,其数量和价值分别如下:(4,20)、(4,24)、(5,38),留给卡卡西采摘水晶珠的总时间是10秒,则选择后两种水晶珠全部摘取,第一种摘取一颗时,可得摘取的最大价值为67.00,如果选择摘前两种水晶珠和两颗第三种水晶珠,所能得价值为59.20。小朋友,你能帮助卡卡西计算出给定时间内所能采摘水晶珠的最大价值,从而让她顺利进入花圃采摘字母水晶珠吗?
输入描述 Input Description 共N+1行,第一行为两个整数N(100≤N≤10000)和T(1≤T≤10000)(中间用空格隔开),分别表示字母水晶珠种类数和总的采摘时间;后面N行中,每行两个整数S(1≤S≤100)和V(1≤V≤100)(中间用空格隔开),分别表示这种字母水晶珠的总数量和总价值。
输出描述 Output Description 一行,所能得到的最大价值,输出结果四舍五入保留两位小数。
样例输入 Sample Input 3 10 4 20 4 24 5 38 样例输出 Sample Output 67.00 数据范围及提示 Data Size & Hint 20%的数据100≤N≤500 60%的数据100≤N≤999 100%的数据100≤N≤10000
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=100010;
struct node{
long long num,v;
double p;
}a[maxn];
bool cmp(node a,node b){
return a.p>b.p;
}
int main(){
long long N,T;
scanf("%lld%lld",&N,&T);
for(int i=1; i<=N; i++){
scanf("%lld%lld",&a[i].num,&a[i].v);
a[i].p=a[i].v/(double)a[i].num;
}
sort(a+1,a+1+N,cmp);
double ans=0;
for(int i=1; i<=N; i++){
if(T>=a[i].num){
T-=a[i].num;
ans+=a[i].v;
}else if(T>0){
ans+=T*a[i].p;
break;
}
}
printf("%.2lf",ans);
return 0;
}
蒟蒻站外题求捞,谢谢各位大佬!