P2616题解

发布时间 2024-01-07 19:30:19作者: SunsetLake

思路

一看到题就知道是贪心,题目让我们求最小花费,那么我们就要知道最小花费的构成:路费+餐费。也就是说,只有在餐费和路费都最小的情况下才能达到总费用最小。我们可以把每个点的花费表示出来,再进行排序,这就是贪心策略。那么,每个点的花费怎么求呢?不仅要算单价,还要加上这个点到终点的距离(仔细想想),所以每个点的单价: \(c_i+(e-x_i)\) 。知道了这点,此题也就迎刃而解了。

代码

#include<bits/stdc++.h>
using namespace std;
int k,e,n,ans;
struct node{
	int x,f,c,tal;
}st[110];//结构体用来存每个点的坐标、食物总量、食物单价和总共单价
bool cmp(node s,node g){
	return s.tal<g.tal;
}
int main(){
	cin>>k>>e>>n;
	for(int i=1;i<=n;i++){
		cin>>st[i].x>>st[i].f>>st[i].c;
		st[i].tal=st[i].c+e-st[i].x;//计算出第i个点的总共单价
	}
	sort(st+1,st+1+n,cmp);//以总共单价从小到大排序,贪心
	for(int i=1;;i++){
		k-=st[i].f;//买下第i个点的食物
		if(k>=0){//判断买完第i个点总量达没达到k
			ans+=st[i].tal*st[i].f;//没达到则将总花费加上当前点的总单价*当前点的总数量,继续前往下一个点
		}
		else{//超过了则只买还差的k份,并跳出循环输出答案
			k+=st[i].f;
			ans+=k*st[i].tal;
			break;
		}
	}
	cout<<ans;
	return 0;
}

本蒟蒻的第一篇题解,求过,谢谢管理员大大。