首页 > 编程语言 >【算法训练】贪心

【算法训练】贪心

时间:2023-02-06 17:06:16浏览次数:36  
标签:训练 idx int double 算法 ans 物品 buf 贪心


例题一

有m元钱,n种物品;每种物品有j磅,总价值f元,可以 使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物 品。要求输出用m元钱最多能买到多少磅物品。题解
买性价比最高的商品,即j/f最大的商品

#include<stdio.h>
#include<algorithm>
using namespace std;
struct goods {
double j;//该物品总重量
double f;// 该物品总价格
double s;//该物品性价比
bool operator < (const goods &A) const{//重载小于运算符,确保可以用sort函数将数组按照性价比降序排列
return s>A.s;

}
}buf[1000];
int main(){
double m;
int n;
while(scanf("%lf%d",&m,&n)!=EOF){
if(m==-1 && n==-1) break;
for(int i=0;i<n;i++){
scanf("%lf%lf",&buf[i].j,&buf[i].f);
buf[i].s=buf[i].j/buf[i].f;
}
sort(buf,buf+n);
double ans=0;
int idx=0;
while(m>0 && idx<n){
if(m>buf[idx].f){
ans+=buf[idx].j;
m-=buf[idx].f;
}else{
ans+=buf[idx].j*(m/buf[idx].f);
m=0;
}
idx++;
}
printf("%.3lf\n",ans);//输出
}
return 0;
}

例题二

输入

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数 n(n<=100),表示你喜欢看的节目的总数,然后是 n 行数据,每行包括两个数据 Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每 个时间都用一个正整数表示。n=0表示输入结束,不做处理。

输出

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输 出占一行。

样例输入:

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

样例输出:

5

经过分析发现,选择结束时间最早的节目才能看到更多完整的节目

#include<stdio.h>
#include<algorithm>
using namespace std;
struct program{
int startTime;//节目开始时间
int endTime;//节目结束时间
bool operator <(const program &A) const{
//重载小于运算符
return endTime<A.endTime;
}
}buf[100];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(int i=0;i<n;i++){
scanf("%d%d",&buf[i].startTime,&buf[i].endTime);
}
sort(buf,buf+n);
int currentTime=0,ans=0;//记录当前时间变量初始值为0,答案计数初始值为0
for(int i=0;i<n;i++){//按照结束时间升序遍历所有节目
if(currentTime<=buf[i].startTime){//若当前时间小于等于该节目开始时间,那么收看该节目
currentTime=buf[i].endTime;//当前时间变为该节目结束时间
ans++;//收看节目数加一
}
}
printf("%d\n",ans);
}
return 0;
}


标签:训练,idx,int,double,算法,ans,物品,buf,贪心
From: https://blog.51cto.com/u_15955908/6039814

相关文章

  • 【算法训练】二分查找
    二分查找二分查找建立在待查找元素有序的前提上例题题目描述输入N个学生的学号,然后查询输入输入的第一行为N,即学生的个数(N<=1000)接下来的N行包括N个学生的信息,信息格式......
  • 【算法训练】Hash的应用
    Hash的应用当数据较为庞大,但是数据的数量是有限范围内的,各不相同的。例题题目描述给你n个整数,请按从大到小的顺序输出其中前m大的数。输入每组测试数据有两行,第一行有两个......
  • 欧几里得算法及其扩展
    欧几里得算法及其扩展前言整除:对于整数\(a(a\ne0)\)和\(b\),如果\(\existsq\inZ\),使得\(b=a\timesq\),则称\(a\)能整除\(b\),记作\(a\midb\)。否则,称\(a\)......
  • 一文详解TensorFlow模型迁移及模型训练实操步骤
    摘要:本文介绍将TensorFlow网络模型迁移到昇腾AI平台,并执行训练的全流程。然后以TensorFlow1.15训练脚本为例,详细介绍了自动迁移、手工迁移以及模型训练的操作步骤。本文分......
  • 查找算法之斐波那契查找
    由来:斐波那契数列:前两项之和等于第三项,假如下标为k,那么f[k]=f[k-1]+f[k-2]。如果将一条长为f[k]的线段分为两条线段,它们的长度分别为f[k-1]和f[k-2],这种分法很接近黄......
  • 《区块链基础知识25讲》-第十讲-哈希算法
    无论输入数据的大小及类型如何,均可以将输入数据转换成固定长度的输出加密哈希算法拥有的特征能为任意类型的数据快速创建哈希值确定性:相同输入必定产生相同哈希值,换句话说,......
  • 代码随想录算法训练营第十八天|LeetCode 513.找树左下角的值、112. 路径总和 、113.路
    513.找树左下角的值文章:代码随想录(programmercarl.com)视频:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路(......
  • 一文详解TensorFlow模型迁移及模型训练实操步骤
    摘要:本文介绍将TensorFlow网络模型迁移到昇腾AI平台,并执行训练的全流程。然后以TensorFlow1.15训练脚本为例,详细介绍了自动迁移、手工迁移以及模型训练的操作步骤。本文......
  • 机器学习中入门级必学的算法有哪些?
    文章目录​​一、K-近邻算法​​​​二、线性回归​​​​三、逻辑回归​​​​四、决策树算法​​​​五、集成算法​​​​六、聚类算法​​一、K-近邻算法什么是k-近邻算......
  • Acwing - 算法基础课 - 笔记(数学知识 · 四)(补)
    数学知识(四)这一小节讲的是容斥原理和简单博弈论。容斥原理定义最基本的,假设有3个两两相交的圆。那么三个圆所覆盖的面积大小为如果是2个圆的话,那么其所覆盖的面积为如果是4......