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

C++U4-02-贪心算法2

时间:2023-10-30 14:24:09浏览次数:37  
标签:02 int U4 C++ num 通道 col 隔开 row

上节课作业部分


 

 

[纪念品分组]

 

 

【算法分析】
贪心算法:先对数组从小到大排序,用 l=1, r=n 指针指向首尾元素;如果 pl+pr≤w,则将pl和pr分一组,指针 l++,r--。如果 pl+pr>w,则将 pr单独作为一组,指针 r--。如此反复直到取完所有元素。

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

int w, n, ans;
int p[30010];

int main() {
    cin >> w >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    int l = 1, r = n; //左右指针,指向首尾元素
    sort(p + 1, p + n + 1);
    while (l <= r) {
        if (p[l] + p[r] <= w) { //物品i和物品j分一组 
            l++;
            r--;
            ans++;
        }
        else {  //物品j单独一组 
            r--;
            ans++;
        }
    }
    cout << ans;
    return 0;
}
点击查看代码

 

 [活动安排]

 

【算法分析】
当只有两个活动(两个时间段)的时候,选择参加哪个都是可以的,当有第三个活动的时候,这时候就会发现优先选择前两个结束较早的那个活动,才能完整的看第三个活动,所以尽早看完一个活动就有机会参加其它活动(也就是按结束时间从早到晚排序)。

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

struct node {
    int s, e;//开始时间,结束时间
}a[1010]; 

bool cmp(node a, node b) {
    return a.e < b.e;
}

int main() {
    int n, num = 1;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i].s >> a[i].e;
    sort(a, a + n, cmp);
    int last = a[0].e;
    for (int i = 1; i < n; i++) {
        if (a[i].s >= last) { //下一个活动的开始时间大于等于下一个活动的结束时间
            num++;
            last = a[i].e;
        }
    }
    cout << num;
    return 0;
}
点击查看代码

 [排座椅]

 

 

 本题目的是找到通道的最优位置,贪心算法思路是,选择隔开最多人的通道,记录输出出来;

代码思路是通过输入的交头接耳的同学的行列位置,就可以判断是横着聊天还是竖着聊天,可以选择用行还是列的通道隔开;然后就结构题数组中不断记录通道的编号和通道隔开的交头接耳的同学的对数,就可以记录哪个线隔开的人多,然后根据隔开的人排序,选出哪条线,然后再根据线的序号排序,因为题目要求小编号的线先输出。

【算法分析】
本题的贪心需要预处理下,定义结构体 Pos 存当前位置和当前位置能隔开的对数,开 2 个结构体一维数组,row[i].num 记录如果在第 i 行加通道,可以分割多少对调皮学生,col[j].num 记录如果在第 j 列加通道,可以分割多少对调皮学生。然后用 sort 排序,隔开对数多的放在前面,在此前提下,位置小的排到前面(输出的结果也要排序)。最后输出分割学生最多的前 k 行和前 l 列。

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

const int N = 1e3 + 10;
struct Pos {
    int pos, num;  // 位置,隔开的对数 
} row[N], col[N];  // 横向通道,纵向通道 

bool cmp1(Pos a, Pos b) {
    return a.num > b.num;  // 隔开对数多的放前面 
}

bool cmp2(Pos a, Pos b) {
    return a.pos < b.pos;  // 位置小的排在前面 
}

int main() {
    int m, n, k, l, d;  // m 行 n 列的教室,k 个横向通道,l 个纵向通道,d 对交头接耳的同学 
    cin >> m >> n >> k >> l >> d;
    for(int i = 1; i <= d; i++) {
        int x1, y1, x2, y2;  // 会交头接耳的两个同学的位置
        cin >> x1 >> y1 >> x2 >> y2;
        if(y1 == y2) {  // 同一列 
            int x = min(x1, x2);
            row[x].pos = x;
            row[x].num++;  // x 这条横向通道能隔开的对数加 1 
        }else if(x1 == x2) {  // 同一行 
            int y = min(y1, y2);
            col[y].pos = y;
            col[y].num++;  // y 这条纵向通道能隔开的对数加 1 
        } 
    }
    sort(row + 1, row + m, cmp1);  // 1~m-1 
    sort(col + 1, col + n, cmp1);  // 1~n-1 
    sort(row + 1, row + k + 1, cmp2);  // 1~k 按照位置升序 
    sort(col + 1, col + l + 1, cmp2);  // 1~l 按照位置升序 
    for(int i = 1; i <= k; i++) {
        cout << row[i].pos << " ";
    } 
    cout << endl;
    for(int i = 1; i <= l; i++) {
        cout << col[i].pos << " ";
    }
    return 0;
}
点击查看代码

 

 凑零钱

 雷达安装

 

 

点击查看代码

 

标签:02,int,U4,C++,num,通道,col,隔开,row
From: https://www.cnblogs.com/jayxuan/p/17797752.html

相关文章

  • SQL Server2022安装图文教程
    一:下载(1)官网下载链接https://www.microsoft.com/zh-cn/sql-server/sql-server-downloadsSQLServer下载|Microsoft(2)在下载目录中找到下面这个小的安装包SQL2022-SSEI-Dev.exe,运行开始下载SQLserver;二:安装SqlServer2022服务端(3)双击安装包 【SQLServer2022-x64-CHS-Dev.iso......
  • 2023年第 4 期《Python 测试平台开发》进阶课程(11月14号开学)
    2023年第4期《Python测试平台开发》进阶课程主讲老师:上海-悠悠上课方式:微信群视频在线教学,方便交流本期上课时间:11月14号(每周二、四晚上21:00-22:30)报名费:报名费3800一人(之前学过《python接口+测试开发》课程的同学可优惠!)联系微信/QQ:283340479课程环境:1.pycharm+pytho......
  • C++U5-深度优先搜索-03(记忆化搜索、剪枝和优化)
    ......
  • 02Collection的遍历方式
    Collection的遍历方式遍历器遍历增强for循环遍历Lambda表达式遍历普通for只有List系列的才能用,Set用不了一、迭代器遍历iteratorn.迭代器,迭代程序。迭代器不依赖索引。迭代器遍历就是把元素一个一个的获取出来二、迭代器的Iterator类,和它的常用方法迭代器......
  • C++23:多维视图(std::mdspan)
    C++23:多维视图(std::mdspan)介绍在C++23中,std::mdspan是一个非拥有的多维视图,用于表示连续对象序列。这个连续对象序列可以是一个简单的C数组、带有大小的指针、std::array、std::vector或std::string。这种多维视图通常被称为多维数组。多维数组的形状由其维数(也称为秩)和每个......
  • C++中低级内存操作
    C++中低级内存操作C++相较于C有一个巨大的优势,那就是你不需要过多地担心内存管理。如果你使用面向对象的编程方式,你只需要确保每个独立的类都能妥善地管理自己的内存。通过构造和析构,编译器会帮助你管理内存,告诉你什么时候需要进行内存操作。将内存管理隐藏在类中显著提高了可用性,......
  • 排序算法:选择排序,分别用c++、java、python实现
    选择排序介绍选择排序(SelectionSort)是一种简单的比较排序算法,它的工作原理如下:分区:将待排序的数组分成两个部分,一个部分是已排序的子数组,另一个部分是未排序的子数组。初始时,已排序的子数组为空,而未排序的子数组包含整个数组。选择最小值:从未排序的子数组中找到最小(或最大,根据......
  • 算法题:分别用c++/python/java实现回文数
    回文数是一个数字,从左到右和从右到左读都是相同的数字序列。换句话说,回文数在数值上是对称的。一些常见的回文数示例包括:单个数字:例如1、2、3等,它们本身就是回文数,因为它们只有一个数字。两位数:例如11、22、33等,它们也是回文数,因为它们的左右两个数字相同。多位数:例如121、1331、12......
  • 用c++写一个高精度计算的除法运算
    高精度除以低精度以下这段代码的主要作用是将一个大整数(以字符数组形式表示)除以一个整数,并输出结果。具体来说,代码将大整数a1(“1256”)除以整数b(3),并输出商。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;intmain(){chara1[100]="1256";......
  • 【专题】2022数字孪生建设解决方案报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34041本次报告合集分为数字孪生综述、技术架构建设、核心技术分享、新型技术成果展示以及重点行业应用五大内容版块。从数字孪生应用建设路径的角度出发,着重提出了“数智视融合,虚实人联动”的观点,并提供数字孪生应用技术的参考。同时,本报告合集还完......