链接:https://ac.nowcoder.com/acm/contest/911/D
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
Special Judge, 64bit IO Format: %lld
题目描述
有 n件商品,第 i件商品价格为 a[i],购买后,其它所有未购买的商品价格乘上 p[i],现在要买下所有商品,输出最小耗费。
输入描述:
第一行一个整数 n(n \leq 10^5)n(n≤10
5
),接下来 n 行,第 i 行两个数字a[i],p[i],其中 a[i] 为整数,p[i] 为浮点数,1\leq a[i]\leq 10^5, 0\leq p[i] \leq 11≤a[i]≤10
5
,0≤p[i]≤1。
输出描述:
保留六位小数输出。
示例1
输入
复制
2
1 0.5
10 1
输出
复制
6.000000
示例2
输入
复制
3
27545 0.79
77924 0.1
64441 0.66
输出
复制
85769.339000
备注:
- 样例 1:先买 1 号商品,再买 2 号商品。
- 样例 2:先买 2 号商品,再买 1 号,最后买 3 号。
思路:贪心,受整体影响越大的越先买。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct item
{
double a;
double p;
friend bool operator < (item x , item y)
{
return x.a * (1 - y.p) < y.a * (1 - x.p);
}
};
int main()
{
item arr[100000];
int n;
cin >> n;
for(int i = 0 ; i < n ; ++ i)
scanf("%lf %lf", &arr[i].a , &arr[i].p);
sort(arr,arr+n);
double k = 1.0;
double ans = 0;
for(int i = 0 ; i < n ; ++ i)
{
ans += arr[i].a * k;
k *= arr[i].p;
}
printf("%.6lf\n", ans);
}