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); }
浙公网安备 33010602011771号