o(n!)(新疆第五届 icpc)

链接: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);
     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值