蓝桥杯 贪心练习

2025蓝桥杯系列真题系列中等题11_15_问题B - C语言网 贪心加前缀和

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e3+10;
int n;
int ans=0;
int sum[N];
struct stu
{
	int a,b,c,d;
}t[N];

bool cmp(stu x,stu y)
{
	return x.d<y.d;
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> t[i].a >> t[i].b >> t[i].c;
		t[i].d=t[i].a+t[i].b+t[i].c;
	}
	sort(t+1,t+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(i==1) sum[i]=t[i].a+t[i].b;
		else sum[i]=sum[i-1]+t[i-1].c+t[i].a+t[i].b;
		ans+=sum[i];
	}
	cout << ans;
	
	return 0;
}

### 关于蓝桥杯竞赛中的贪心算法 #### 贪心算法概述 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望达到全局最优解的方法[^3]。然而需要注意的是,这种算法并不总是能够找到整体的最佳解决方案,因为它依赖于局部最优解的组合。 #### 局部与全局最优的关系 对于某些特定的问题来说,通过一系列局部最优决策确实可以获得最终的整体最佳解答;但对于其他复杂情况,则可能仅能得到次优的结果。为了确保贪心策略的有效性,在应用之前应当验证所选问题是否满足无后效性和可证明性质的要求——比如利用拟阵理论来确认能否实现全局优化[^1]。 #### 实际案例分析:活动安排/区间调度问题 这类问题是典型的适合采用贪心法则求解的例子之一。其核心在于按照结束时间先后顺序排列各个事件,并尽可能多地挑选那些互不冲突的任务加入日程表里。具体操作如下: - 将所有候选时间段按终止时刻升序排序; - 初始化一个空集合用于存储已选定的时间段; - 对每一个待处理项执行循环遍历: - 如果该时段与其前一被接纳者之间不存在重叠部分,则将其纳入结果集中并继续考察下一个对象; 这种方法不仅简单直观而且效率较高,能够在多项式时间内完成计算过程。 ```python def activity_selection(start_times, end_times): activities = sorted(zip(end_times, start_times)) selected_activities = [] last_end_time = float('-inf') for end, start in activities: if start >= last_end_time: selected_activities.append((start, end)) last_end_time = end return selected_activities ``` 此函数接收两个列表作为参数,分别代表各活动开始时间和结束时间,并返回由非交集子序列构成的新数组。 #### 论证贪心法适用于本题的关键特性 上述例子之所以能成功运用贪心原理解决问题,是因为它符合以下条件: - **无后向效应**:一旦做出决定就不会改变之前的任何结论。 - 存在一个清晰的标准指导每次迭代时如何作出最优抉择(此处指优先考虑最早截止日期)。 #### 相关练习建议 针对准备参加蓝桥杯的学生而言,除了掌握基础概念外还需要积累更多实战经验。可以从官方历年真题库入手,特别关注涉及资源分配、路径规划等方面的内容进行专项训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值