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

C++U4-贪心算法1

时间:2023-10-23 15:34:42浏览次数:55  
标签:cnt int U4 sum C++ 算法 include 贪心

本节学习目标:贪心算法的概念以及对应练习题

 贪心算法概念

贪心算法的特点

 利用贪心算法的两个性质

 练习1:最优装载问题

 

 【本题算法分析】

优先把重量小的物品放进去,在容量固定的情况下,装的物品量最多。
因此采用重量最轻者先装的贪心选择策略,可从局部最优达到全局最优。

参考代码

#include <iostream>
#include <algorithm>
using namespace std;
int w[1010];
int main() {
    int c, n, cnt = 0;
    cin >> c >> n;
    for(int i = 0; i < n; i++){
        cin >> w[i];
    }
    sort(w,w + n);
    for(int i = 0; i < n; i++){
        if(c - w[i] < 0){
            break;
        }
        c -= w[i];
        cnt++;
    }
    cout << cnt;
    return 0;
}

 

 练习2:粮草

【算法分析】
优先选择价格低的粮草,在需要的总量固定的情况下,总的消费最少。
因此采用优先选择价格低的粮草的贪心选择策略,可从局部最优达到全局最优。

【参考代码】

#include <iostream>
#include <algorithm>
using namespace std;

struct node{
    int p;
    int a;
}b[5010];
bool cmp(node x, node y){ if(x.p < y.p) return true; else return false; }
int main() { int n, m, sum = 0; cin >> n >> m; for(int i = 1; i <= m; i++){ cin >> b[i].p >> b[i].a; } sort(b + 1, b + m + 1, cmp); for(int i = 1; i <= m; i++){ if(n - b[i].a <= 0){ sum += n * b[i].p; break; } n -= b[i].a; sum += b[i].a * b[i].p; } cout << sum; return 0; }

 

  练习3:接水问题

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

因此采用接水时间最短者先接水的贪心选择策略,可从局部最优达到全局最优

【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;

struct node{
    int t;
    int id;
}a[1010];

bool cmp(node x, node y){
    if(x.t < y.t) return true;
    else return false;
}

int main() {
    int n;
    cin >> n;
    double sum = 0; 
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        a[i].t = x;
        a[i].id = i;
    }
    sort(a + 1, a + n + 1, cmp);
    for(int i = 1; i <= n; i++){
        cout << a[i].id << " ";
        sum += a[i].t * (n - i);
    }
    cout << endl;
    printf("%.2f", sum / n);
    return 0;
}

  练习4:书架

【算法分析】
优先选择身高高的奶牛,在书架高度固定的情况下,奶牛的数量最少。
因此采用身高最高者先选择的贪心选择策略,可从局部最优达到全局最优。

【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;

int a[20010];

bool cmp(int x, int y){
    if(x > y) return true;
    else return false;
}

int main() {
    int n, b;
    cin >> n >> b;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    sort(a+1,a+n+1,cmp);
    int sum = 0, cnt = 0;
    for(int i = 1; i <= n; i++){
        if(sum + a[i] >= b){
            cnt++;
            break;
        }
        sum += a[i];
        cnt++;
    }
    cout << cnt;
    return 0;
}

 

 练习5:数列乘积变1术

 

 

【算法分析】
采用优先把小于 0 的数则变为 −1,大于 0 的数则变为 1 的贪心策略。

如果序列中 -1 的个数为奇数,则判断序列中是否存在 0,不存在说明需要将其中一个 -1 加 2 变为 1,总的花费加 2。

【参考代码】
#include <iostream>
using namespace std;

long long n, cnt, sum;

int main() {
    cin >> n;
    int flag = 0; 
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        if(x < 0){ //小于0则变为-1 
            cnt++;
            sum += (-1) - x;
        } else if(x > 0){ //大于0则变为1 
            sum += x - 1;
        } else {   //等于0,变为-1或者1,标记出现过0 
            sum++;
            flag = 1;
        }
    }
    if(cnt % 2 == 1 && flag == 0) cout << sum + 2; //奇数个-1并且序列中没有0,则需将其中一个 -1 加2,总的花费加2 
    else cout << sum;
    return 0;
}

 

贪心算法总结 

 

标签:cnt,int,U4,sum,C++,算法,include,贪心
From: https://www.cnblogs.com/jayxuan/p/17782598.html

相关文章

  • C?C++?
    代码逆向在这里需要注意的几个点:c#语言赋值号(=)右边的值同样会跟着左边的值改变,如array6=array2,array6+=2;这个时候array2也会变如array7[num5] += text2[k] % '\u0005';,逆向则为array7【num5】-=ord(text【k】)%5,即chr-->ord空格的ASCII为32则逆向代码为v6=35j=0......
  • 如何从C++Pytho:变的思维方
    有人说用Python编程很简单,6岁小孩都能学会。计算机视觉专家和编程语言爱好者asyaf刚开始上手Python时也这么想。但门槛低就仅意味着使用简单吗?经常调用API的人是不是一定比可以从零写出源码的人菜?在本文中,asyaf告诉我们,从C++转向Python,是一次「从个人到社区」的思维......
  • 解决Clion中写多个C++文件中存在多个main函数报错的问题
    解决Clion中写多个C++文件中存在多个main函数报错的问题在刷题写C++的时候,常常因为要写多个文件,这时存在多个main就会报错,通常解决这个问题会有以下两种解决方法:把不需要的main给注释掉新建一个Project项目这边我介绍一种新的办法:(适用于IDEA)1.先下载这个插件,C/C++Single......
  • 让Devc++使用c11标准
    默认情况下,C语言编译器gcc4.7.2不符合任何ANSI/ISOC标准。当前默认值等效于-std=gnu90,这是1989/1990标准,扩展名为GNU-specific。  如果要实现标准一致性,比如c89,c90,c99或c11,可以使用以下任意一种:-std=c90-pedantic-std=c99-pedantic-std=c11-pedantic-std=c90也可以......
  • Modern C++ Overview综览
    ##PartI:Language(第一篇:语言)-大局观——简直像个新语言给出一个完整实例,展示(几乎)所有新特性的样貌,让学员从真实代码中一次性窥得(几乎)全豹,得知即将面对的新知和挑战。-auto,typededuction型别/型态推导是ModernC++至关重要的某种基础;这一节为后头诸多特性打好基础。-......
  • 挑战用很多种方法解决A+B(c++)
    写在前面的本文章主要是博主自己想写。水篇文章。正常作法#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b; cin>>a>>b; cout<<a+b; return0;}数组#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[3]; cin>>a[1]>......
  • C++零基础教程(引用)
    (文章目录)前言本篇文章我们来讲解C++中非常重要的一个概念,这个概念就是引用,引用在C++中经常使用,下面就让我们来看看到底什么是引用吧。一、引用概念介绍及使用方法在C++中,引用是一种别名,它允许我们使用一个已经存在的对象来创建一个新的名称。引用提供了一种更直观、简洁和安......
  • C++中的RTTI机制、多继承中的虚函数
    C++中的RTTI机制基类有虚函数时才能实现RTTI机制:基类无虚函数时,typeid(*pA)返回的是pA声明时的类型。基类有虚函数时,typeid(*pA)返回的是pA指向对象的类型。比较两个带有虚函数的类的对象是否相等if(typeid(*a)==typeid(B))if(dynamic_cast<B*>(a)):如果能够成功向......
  • 1402. 做菜顺序(前缀和、公式变形、动态规划、贪心)
     首先本题可以抽象为从原数组中选出一些子数组,并让这些子数组的(i)*a[i]的和最大解法:将原数组从大到小排序f[i]=i*a1+(i-1)*a2+...f[i-1]=(i-1)*a1+(i-2)*a2+...f[i]=f[i-1]+(a1+a2+....)//加上一个前缀和classSolutio......
  • C++ 读写锁
    官网:https://zh.cppreference.com/w/cpp/thread/shared_mutex1.何为读写锁相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。读写锁可以有三种状态:读模式加锁状态;写模式加锁状态;不加锁状态;只有一个线程可以占有写模式的读写......