专栏文章
题解:CF1211C Ice Cream
CF1211C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipr5mjp
- 此快照首次捕获于
- 2025/12/03 16:35 3 个月前
- 此快照最后确认于
- 2025/12/03 16:35 3 个月前
此篇题解包含 kotlin 和 c++ 代码。
题意
给定 天的冰淇淋购买计划,每天要吃的范围是 到 份,价格是 ,需要在 天内吃掉恰好 份冰淇淋,求最小花费。若无法满足条件,输出 。
思路
考虑贪心。
先计算出每天吃的最少的冰淇淋的和 。
如果 ,就一定不行,输出 。
否则求出剩下的冰淇淋个数 ,先按照 的大小从小到大排序, 小的先吃,并且尽可能多吃,吃到 为止。
注意会爆
int。时间复杂度 。
Code
kotlin
KOTLINimport java.util.*
data class lyl(
val x:Long,
val y:Long,
val z:Long
)
fun main() {
val scanner=Scanner(System.`in`);
val n=scanner.nextInt();
val k=scanner.nextLong();
val a=Array(n){
lyl(scanner.nextLong(),scanner.nextLong(),scanner.nextLong());
}
var sum=0L;
for((x,y,z) in a){
sum+=x;
}
if(sum>k){
println(-1);
return;
}
var ans=0L;
for((x,y,z) in a){
ans+=x*z;
}
var num=k-sum;
a.sortBy {it.z};
for((x,y,z) in a){
if(num<=0){
break;
}
ans+=minOf(num,y-x)*z;
num-=minOf(num,y-x);
}
if(num>0){
println(-1);
}
else{
println(ans);
}
}
c++
CPP#include<bits/stdc++.h>
#define int long long
#define double long double
#define bug cout<<"___songge888___"<<'\n';
using namespace std;
int n,k;
struct lyl{
int x,y,z;
}a[200010];
bool operator<(lyl a,lyl b){
return a.z<b.z;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
}
int sum=0;
for(int i=0;i<n;i++){
sum+=a[i].x;
}
if(sum>k){
cout<<-1<<'\n';
return 0;
}
int ans=0;
for(int i=0;i<n;i++){
ans+=a[i].x*a[i].z;
}
int num=k-sum;
sort(a,a+n);
for(int i=0;i<n&&num>0;i++){
ans+=min(num,a[i].y-a[i].x)*a[i].z;
num-=min(num,a[i].y-a[i].x);
}
if(num>0){
cout<<-1<<'\n';
}
else{
cout<<ans<<'\n';
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...