链接:https://ac.nowcoder.com/acm/contest/911/D
来源:牛客网
题目描述
有 n件商品,第 i件商品价格为 a[i],购买后,其它所有未购买的商品价格乘上 p[i],现在要买下所有商品,输出最小耗费。
输入描述:
第一行一个整数 n(n≤10^5)接下来 n 行,第 i 行两个数字a[i],p[i],其中 a[i] 为整数,p[i] 为浮点数,1≤a[i]≤10^5,0≤p[i]≤1
输出描述:
保留六位小数输出。
题解
假设有两个商品x,y. 如果优先选x,那么要满足x.a+y.a*x.p<y.a+x.a*y.p; 那么结构体数组按照这个排序规则进行排序,从前往后选就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node{
double a,p;
bool operator < (const node& temp)const {
return a+temp.a*p<temp.a+a*temp.p;
}
}a[maxn];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].a>>a[i].p;
}
sort(a,a+n);
double ans=0,p=1;
for(int i=0;i<n;i++){
ans+=p*a[i].a;
p*=a[i].p;
}
printf("%.6f\n",ans);
return 0;
}