专栏文章

题解:CF1211C Ice Cream

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mipr5mjp
此快照首次捕获于
2025/12/03 16:35
3 个月前
此快照最后确认于
2025/12/03 16:35
3 个月前
查看原文
此篇题解包含 kotlin 和 c++ 代码。

题意

给定 nn 天的冰淇淋购买计划,每天要吃的范围是 aia_ibib_i 份,价格是 cic_i,需要在 nn 天内吃掉恰好 kk 份冰淇淋,求最小花费。若无法满足条件,输出 1-1

思路

考虑贪心。
先计算出每天吃的最少的冰淇淋的和 sumsum
如果 sum>ksum>k,就一定不行,输出 1-1
否则求出剩下的冰淇淋个数 numnum,先按照 cic_i 的大小从小到大排序,cic_i 小的先吃,并且尽可能多吃,吃到 num=0num=0 为止。
注意会爆 int
时间复杂度 O(nlogn)O(n \log n)

Code

kotlin

KOTLIN
import 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 条评论,欢迎与作者交流。

正在加载评论...