专栏文章

题解:P12413 「YLLOI-R1-T2」圣诞星

P12413题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip9n4h6
此快照首次捕获于
2025/12/03 08:25
3 个月前
此快照最后确认于
2025/12/03 08:25
3 个月前
查看原文

思路

首先一个显然的性质:按商品初始价格从小到大购买,可以使赠送的优惠券贡献尽可能大,也就是使答案更优。因此开始时先将商品价格升序排序。
观察题目,易知随着优惠券数量的增加,最终花费呈现先降后升的 v 字形趋势。三分答案即可。
因此,经过稍稍的思考和转化,这道题已经变成了一道三分答案的板子题。

代码

CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
ll n,k,m[N],ans=1e15,low,p;
ll check(ll t){//t张券 
	ll sum=0;
	for(int i=1; i<=n; i++)
		sum+=max(0ll,m[i]-t);
	return sum+k*t;
}
int main()
{
	
	cin>>n>>k;
	for(int i=1; i<=n; i++)
		cin>>m[i];
	sort(m+1,m+n+1);
	for(int i=1; i<=n;i++){
		m[i]=max(0ll,m[i]-i+1);
	}
	ll l=0,r=1e9,m1,m2;
	while(r-l>2)//三分答案
	{
		m1=l+(r-l)/3;
		m2=r-(r-l)/3;
		if(check(m1)>check(m2))
			l=m1;
		else
			r=m2;
	}
	cout<<min(min(check(m1),check(m2)),min(check(l),check(r)));//保险起见挑一个最小的
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...