洛谷每日三题——贪心

        贪心算法,你人够贪就会做。贪心就是通过部分最优解来推出全局最优解,可以理解为在每个子阶段都取当前最优解,到最后合并的时候的解是全局最优解。

【深基12.例1】部分背包问题

解析:

        题目给出体积和价值,需要求背包最大容积下的最大价值,物品可拆分,显然是贪心算法。那么如何做到局部最优解?很简单,当然是每次都取最大价值的放进去背包,大错特错!正解应该是每次都取最大的性价比(性价比=价值/体积),如果小于背包当前所剩容积就整个放进去,否则拿部分放进背包。

#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n,t;
double ans;
struct node {
	int m,v;
	double val;
} a[105];
//按性价比排序
bool cmp1(node a,node b) {
	return a.val>b.val;
}

int main() {
	cin>>n>>t;
	for(int i=1; i<=n; i++) {
		cin>>a[i].m>>a[i].v;
		a[i].val=a[i].v*1.0/a[i].m;//计算性价比
	}
	sort(a+1,a+n+1,cmp1);
	for(int i=1; i<=n; i++) {
		if(a[i].m<=t) { //整个放进背包
			ans+=a[i].v;
			t-=a[i].m;
		}
		else {//分割部分放进背包
			ans+=(t*1.0/a[i].m)*a[i].v;
			break;
		}
	}
	printf("%.2f",ans);
	return 0;
}

排队接水

解析:

        题目需要我们求平均等待时间最短的排队顺序及平均等待时间,很简单,就是先由打水时间短的打水,依次往下,所以我们需要按照打水时间进行升序排序,并计算这些人等待时间之和。

#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n;
double ans;
struct node {
	int id,t;
} a[1005];
//按时间进行升序
bool cmp1(node a,node b) {
	return a.t<b.t;
}

int main() {
	double ans=0.0;
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>a[i].t;
		a[i].id=i;//赋予id用于输出第一行
	}
	sort(a+1,a+n+1,cmp1);
	for(int i=1; i<=n; i++) {
		cout<<a[i].id<<" ";
		ans+=a[i].t*1.0*(n-i);//等待时间之和
	}
	cout<<endl;
	printf("%.2f",ans*1.0/n);
	return 0;
}

凌乱的yyy / 线段覆盖

 解析:只要结束时间和开始时间靠的比较近即可,所以我们只需要对结束时间排序,如果该结束时间的起始时间与上一个重叠则遍历下一个,否则就ans++并更新终止时间。

#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n;
double ans;

struct node {
	int a,b;
} p[1000005];
//按照结束时间进行升序排序,只要结束时间和下一个起始时间不撞就好了
bool cmp1(node x,node y) {
	return x.b<y.b;
}

int main() {
	int ans=0;
	cin>>n;
	for(int i=1; i<=n; i++)
	cin>>p[i].a>>p[i].b;
	sort(p+1,p+1+n,cmp1);
	int m=0;
	for(int i=1; i<=n; i++) {
		if(p[i].a>=m) {//符合情况(起始时间在上一个结束时间的后面) 
			ans++;
			m=p[i].b;//更新结束时间 
		}
	}
	cout<<ans; 
	return 0;
}

        蓝桥杯比赛已结束,即使已经知道结果差强人意,也不应该就此颓废,我得调整心态、收拾心情、继续前行。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_谦言万语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值