专栏文章
题解:P14174 【MX-X23-T4】卡常数
P14174题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mino4jrp
- 此快照首次捕获于
- 2025/12/02 05:35 3 个月前
- 此快照最后确认于
- 2025/12/02 05:35 3 个月前
题意简述
-
定义数列 的代价 为其中所有元素的乘积再乘以 ,即
-
定义全体数列的总代价 为每个数列的代价之和,即
对于所有 可以修改一共不超过 次,让 变为 ,最终让 最小。
思路分析
考虑贪心, 为了最小一定要每一个 小。
首先考虑每一个 ,每一次修改相当于对 乘上一个真分数 ,选真分数最小的一定更优,那么相对于整体的 计算修改每一个可以给出的差值贡献,并将这个差值放进大根堆,因为 小于等于所有序列加起来的总长,直接取全部前 个堆顶就好。
AC CODE
CPP#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
long long a[500005],b[500005];
priority_queue<long long> Q;
pair<long double,int> ans[500005];
long long result;
int main()
{
int n,k;
cin>>n>>k;
while(n--)
{
long long x,l;
cin>>x>>l;
long long currmul=x;
for(int i=1;i<=l;i++)
{
cin>>a[i];
currmul*=a[i];
}
result+=currmul;
for(int i=1;i<=l;i++)
{
cin>>b[i];
}
for(int i=1;i<=l;i++)
{
ans[i].first=1.l*(a[i]-b[i])/a[i];
ans[i].second=i;
}
sort(ans+1,ans+l+1);
for(int i=1;i<=l;i++)
{
long long now=currmul;
now=currmul/a[ans[i].second]*b[ans[i].second];
//cout<<currmul-now<<" ";
Q.push(now);
currmul-=now;
//cout<<currmul<<endl;;
}
}
for(int i=1;i<=k;i++)
{
//cout<<result<<" ";
result-=Q.top();
Q.pop();
}
cout<<result;
return 0;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...