首页 > 编程语言 >C++新U4-贪心算法1

C++新U4-贪心算法1

时间:2024-03-03 13:46:06浏览次数:41  
标签:奶牛 定义 int U4 C++ 接水 排序 糖果 贪心

学习目标

贪心算法的概念

[【贪心算法(一)】书架]

 

 

 

 

【题意分析】
选出最少的奶牛数量,让他们的身高相加超过书架的高度。

【思路分析】
优先选择身高高的奶牛,这样子奶牛使用的数量最少。

定义排序规则,将数从大到小排序

定义奶牛数量n和书架高度b,并且输入

输入n个奶牛的身高

从大到小排序n个奶牛的身高

定义两个变量,分别为当前已选的奶牛高度和数量

当前加上选择的奶牛高度大于书架的高度

当前加上选择的奶牛高度使得总高度增加,数量+1

输出选择的奶牛数量

【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
int a[20010];
//定义排序规则,将数从大到小排序
bool cmp(int x, int y){
    return x>y;
}
int main() {
    //定义奶牛数量n和书架高度b,并且输入
    int n, b;
    cin >> n >> b;
    //输入n个奶牛的身高
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    //从大到小排序n个奶牛的身高
    sort(a + 1,a + n + 1,cmp);
    //定义两个变量,分别为当前已选的奶牛高度和数量
    int sum = 0, cnt = 0;
    for(int i = 1; i <= n; i++){
        //当前加上选择的奶牛高度使得总高度增加,数量+1
        sum += a[i];
        cnt++;
        //当前加上选择的奶牛高度大于书架的高度,那么退出
        if(sum >= b){
            break;
        }
    }
    //输出选择的奶牛数量
    cout << cnt;
    return 0;
}
View Code

[【贪心算法(一)】三角形的最大周长]

 

 

 

 

【题意分析】
当前要找出三个长度组成的、面积不为零的三角形的最大周长

【思路分析】
我们假设三角形的边长 a,b,c 满足 a≤b≤c,那么这三条边组成面积不为零的三角形的充分必要条件为 a+b>c。

基于此,我们可以选择枚举三角形的最长边 c,而从贪心的角度考虑,我们一定是选「小于 c 的最大的两个数」作为边长 a 和 b,此时最有可能满足 a+b>c,使得三条边能够组成一个三角形,且此时的三角形的周长是最大的。

因此,我们先对整个数组排序,倒序枚举第 i 个数作为最长边,那么我们只要看其前两个数 A[i−2] 和 A[i−1],判断 A[i−2]+A[i−1] 是否大于 A[i] 即可,如果能组成三角形我们就找到了最大周长的三角形,返回答案 A[i−2]+A[i−1]+A[i] 即可。如果对于任何数作为最长边都不存在面积不为零的三角形,则返回答案 0

定义排序规则进行降序排序

将当前的数组从大到小进行排序

定义一个标记,标记我们并未找到

for循环的方式从前往后找到满足条件的三角形边长

当我们短的两个边相加大于第三边,输出周长,标记已找到

直到最后依旧没有找到符合条件的边

【参考代码】
#include<iostream>
#include<algorithm>
using namespace std;
int arr[110];
//定义排序规则进行降序排序 
bool cmp(int x,int y){
    return x>y;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    //将当前的数组从大到小进行排序 
    sort(arr+1,arr+1+n,cmp);
    //定义一个标记标记我们并未找到 
    bool flag=false;
    //for循环的方式从前往后找到满足条件的三角形边长
    for(int i=1;i<=n-2;i++){
        //当我们短的两个边相加大于第三边,输出周长,标记已找到 
        if(arr[i+1]+arr[i+2]>arr[i]){
            flag=true;
            cout<<arr[i]+arr[i+1]+arr[i+2]<<endl; 
            break;
        }
    }
    //直到最后依旧没有找到符合条件的边 
    if(flag==false)cout<<0<<endl;
    return 0;
}
View Code

 

 

[【贪心算法(一)】打折糖果]

 

【题意分析】
找到买完商店所有糖果需要付出的最小的代价

【思路分析】
首先先将糖果价格从大到小排序,当前糖果大于等于3时,按照三个一组的方式,买两个糖果第三个糖果不用钱,取出三个数,如果不足就将剩下的糖果全部买下

定义排序规则进行降序排序

将当前的数组从大到小进行排序

定义变量表示买完糖果的花费

从价格高的糖果开始购买

最后输出小码君的花费

【参考代码】
#include<iostream>
#include<algorithm>
using namespace std;
int arr[110];
//定义排序规则进行降序排序 
bool cmp(int x,int y){
    return x>y;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    //将当前的数组从大到小进行排序 
    sort(arr+1,arr+1+n,cmp);
    //定义变量表示买完糖果的花费 
    int sum=0;
    //从价格高的糖果开始购买
    for(int i=1;i<=n;i+=3){
        sum+=arr[i];
        if(i+1<=n)sum+=arr[i+1];
    }
    //最后输出小码君的花费
    cout<<sum<<endl; 
    return 0;
}
View Code

[【贪心算法(一)】接水问题]

 

 

【题意分析】
将n个人排序,谁先去接水,然后去求出一个等待时间最小的。

【思路分析】
平均等待时间 = 总等待时间 / n。当第 i 个接水的人在接水的时候,等待的人数为 n-i,为了总等待时间最少,应该让接水时间短的人先接水,这样其他人等待的时间就会最少。

定义数组储存当前的人的接水耗时

输入n和n个接水的人的用时

将n个人的接水用时从小到大排序

定义一个double变量用于储存所有人的接水等待时间

用for循环将当前人接水等待的时间加到总和中

输出平均值

【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
//定义数组储存当前的人的接水耗时
int a[1020];
int main() {
    //输入n和n个接水的人的用时
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
    }
    //将n个人的接水用时从小到大排序
    sort(a+1,a+n+1);
    //定义一个double变量用于储存所有人的接水等待时间
    double sum = 0; 
    //用for循环将当前人接水等待的时间加到总和中
    for(int i = 1; i <= n; i++){
        sum += a[i] * (n - i);
    }
    //输出平均值
    printf("%.2f", sum / n);
    return 0;
}
View Code

 

 

初赛知识:

 

 

作业学习系统中有讲解;

 

标签:奶牛,定义,int,U4,C++,接水,排序,糖果,贪心
From: https://www.cnblogs.com/jayxuan/p/18049919

相关文章

  • C++第二课 while循环
    循环while(条件){   循环体}#include<bits/stdc++.h>usingnamespacestd;intmain(){   inti,s;   i=1;   s=0;   while(i<=100)   {      s=s+i;      i=i+1;   }   cout<<s<<endl;   return0;}计算1......
  • 是学习c++还是java?
    上高中时,自己第一次接触到学校的中华学习机和苹果机,当时中华学习机上可以进行basic编程,那时候自己其实就爱上编程,但是没有人指点,也学习不得法,所以就没有进行下去!大学时,自己的主攻专业并不是计算机,但是学习了《计算机基础》和《c程序设计》,前者主要学习dos命令和wps文字处理,后者主......
  • C++第一课 输出Hello World
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ }这是一个固定的格式,记住就行了。#include<bits/stdc++.h>usingnamespacestd;intmain(){   cout<<"Hello,World!"<<endl;   return0;}这是一个简单的输出Hello,World! #include<bits/stdc......
  • Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
    一、前言音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件。在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料得知原来是缺少sps/pps信息,监控行业的rtsp/rtmp/录像mp4文件都是会带的,所以很少遇到这个......
  • C++ 多态
    原文多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。1#include<iostream>2usingnamespacestd;3classShape{4protected:5......
  • C++第七节课 new开辟空间 delete释放空间
    #include<iostream>usingnamespacestd;//C中开辟空间的方式所有的返回值都是void*///int*p=(int*)malloc(sizeof(int))///malloc在堆上开辟空间并没有进行初始化//////int*pa=(int*)calloc(1,sizeof(int));///calloc在堆上开辟空间是有初始化的......
  • C++ 输入/输出运算符重载
    C++能够使用流提取运算符>>和流插入运算符<<来输入和输出内置的数据类型。您可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数。下面的实例演......
  • 随笔记录篇——C++iostream库 以及std
    这篇文章非原创,来自我学习过程中看到的其他博主发的一些资料,解决了我的疑问,在此进行整理。C语言的标准输入输出库是stdio.h库,是一个函数库,而不是类库。其中包含了我们其中所用的scanfpringf都是一些独立的全局函数,因为C语言是不支持类的。C++的标准输入输出库iostream是一个类......
  • C++ 关系运算符重载
    C++语言支持各种关系运算符(<、>、<=、>=、==等等),它们可用于比较C++内置的数据类型。您可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。1#include<iostream>2usingnamespacestd;3 4classDistance5{6  private:7 ......
  • C++ 一元运算符重载
    一元运算符只对一个操作数进行操作,下面是一元运算符的实例:递增运算符(++)和递减运算符(--)一元减运算符,即负号(-)逻辑非运算符(!)一元运算符通常出现在它们所操作的对象的左边,比如!obj、-obj和++obj,但有时它们也可以作为后缀,比如obj++或obj--。下面的实例演示了如何......