PriceFixed

题目:

https://codeforces.com/contest/1539/problem/D

Lena是莫斯科最经济的女孩。所以,当她爸爸让她买些食物去乡下旅行时,她去了最好的商店——“PriceFixed”。以下是该商店的一些规则:

商店有无限数量的每种产品。
所有产品的价格相同:每件 2 卢布。
对于有经验的买家,每件产品 i 都有折扣:如果您购买双件产品(任何类型,不一定是类型 i),那么对于未来所有购买的第 i 件产品,都有 50% 的折扣(因此您可以用 1 卢布购买第 i 个产品的物品!)。
Lena 需要购买 n 个产品:她必须至少购买第 i 个产品的 a 个项目。帮助 Lena 计算如果她选择了最佳购买顺序,她需要花费的最低金额。请注意,如果她愿意,她可以购买比需要更多的产品。

输入
第一行包含一个整数 n (1≤n≤100000)——产品的数量。

接下来的 n 行中的每一行都包含一个产品描述。每个描述由两个整数 ai 和 bi 组成(1≤ai≤1014,1≤bi≤1014)——第 i 个产品所需的数量以及您需要购买多少个产品才能获得第 i 个产品的折扣.

所有ai的总和不超过1014。

输出
输出 Lena 进行所有购买所需的最小金额。
在第一个示例中,Lena 可以通过以下方式购买产品:

一件产品 3 2 卢布,
一件产品 1 为 2 卢布,
一件产品 1 为 2 卢布,
一件商品 2 的价格为 1 卢布(她可以使用折扣,因为已经购买了 3 件商品),
一件产品 1 的价格为 1 卢布(她可以使用折扣,因为已经购买了 4 件商品)。
她总共花了 8 卢布。事实证明,花更少的钱是不可能的。

在第二个示例中,Lena 可以通过以下方式购买产品:

一件产品 1 为 2 卢布,
两件产品 2,每件 2 卢布,
一件产品 5 2 卢布,
一件产品 3 为 1 卢布,
两件产品 4,每件 1 卢布,
一件产品 1 为 1 卢布。
她总共花了 12 卢布。

 

思路:

按dis从小到大排序

判断当前的s到不到dis,就消耗dis大的

因为数据比较大就需要判断和优化

最后还要收尾一下ps==pe

注意所有的数据范围都是longlong

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
struct nnode
{
    ll no,num,dis;
};
nnode node[maxn];
int cmp(nnode x,nnode y)
{
    return x.dis<y.dis;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {  node[i].no=i;
        scanf("%lld %lld",&node[i].num,&node[i].dis);
    }
    ll s=0;
    sort(node+1,node+n+1,cmp);

    int ps=1,pe=n;
    long long ans=0;
    while(ps<pe)
    {
        while(s<node[ps].dis&&ps<pe)
        {
            if(node[pe].num)
            {   ll tt=min(node[ps].dis-s,node[pe].num);
                 ans+=2*tt;
                   s+=tt;
                node[pe].num-=tt;
            }
            else
              pe--;
        }
        if(s>=node[ps].dis)
        { ans+=node[ps].num;
        s+=node[ps].num;
         node[ps].num=0;

          ps++;
        }
        if(node[pe].num==0)
            pe--;
        if(node[ps].num==0)
            ps++;

    }
    while(node[ps].num)
    {
        if(s<node[ps].dis)
        {
            ll tt=min(node[ps].dis-s,node[ps].num);
                 ans+=2*tt;
                   s+=tt;
                node[pe].num-=tt;
        }
        if(s>=node[ps].dis)
        {
            ans+=node[ps].num;
            s+=node[ps].num;

            node[ps].num=0;
        }
    }

    printf("%lld\n",ans);
}

 

posted @ 2021-07-14 15:49  废柴废柴少女  阅读(71)  评论(0)    收藏  举报