ACM贪心总结

2024-09-04 22:58
文章标签 总结 贪心 acm

本文主要是介绍ACM贪心总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

贪心法是一种解决问题的策略。如果策略正确,那么贪心法往往是易于描述,易于实现的。选择策略最关键的是读懂题,翻译能力和抽象能力。 如果不能提取有用的信息那么往往会将问题复杂化最后那自己绕进去。 贪心再进行操作前多会用sort排序或结构体然后对结构体的一个成员排序 根据其他成员的关系求解。

多机调度问题(上次列举了其中一种情况)
n个作业组成的作业集,可由m台相同机器加工处理。要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。作业不能拆分成更小的子作业;每个作业均可在任何一台机器上加工处理。当n<=m时,只要将作业时间区间分配给作业即可;当n>m时,首先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说从剩下的作业中,选择需要处理时间最长的,然后依次选择处理时间次长的,直到所有的作业全部处理完毕,或者机器不能再处理其他作业为止。如果我们每次是将需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处理完了只剩所需时间最长的作业在处理的情况,这样势必效率较低

#include<iostream>    
#include<algorithm>      
using namespace std;    
int speed[10010];    
int mintime[110];    bool cmp( const int &x,const int &y)    
{    return x>y;    
}    int main()    
{    int n,m;           memset(speed,0,sizeof(speed));    memset(mintime,0,sizeof(mintime));    cin>>n>>m;    for(int i=0;i<n;++i) cin>>speed[i];    sort(speed,speed+n,cmp);    for(int i=0;i<n;++i)     {   *min_element(mintime,mintime+m)+=speed[i];     }     cout<<*max_element(mintime,mintime+m)<<endl;   
}  

区域覆盖问题在这里插入图片描述

Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
Input
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.
The input is terminated by a line containing pair of zeros
Output
For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. “-1” installation means no solution for that case.

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
struct yuan
{double l,r;
}a[1000000];
int cmp(yuan a,yuan b)
{return a.r<b.r;
}
int main()
{int m,n,c,d,p=0,s=0,o=0;double k;while(cin>>m>>n){p=0;o++;if(m==0&&n==0){break;}for(int i=0;i<m;i++){cin>>c>>d;if(d>n){p=1;}a[i].l=c-double(sqrt(n*n-d*d));//根据圆心计算出小岛在海岸线上的范围a[i].r=c+double(sqrt(n*n-d*d));}sort(a,a+m,cmp);//根据右区间的左标排序k=a[0].r,s=1;for(int i=1;i<m;i++){if(a[i].l>k){k=a[i].r;s++;//判断是否有重叠}}if(p==1)cout<<"Case "<<o<<": "<<-1<<endl;elsecout<<"Case "<<o<<": "<<s<<endl;}return 0;
}

北京大学的许多研究生住在万柳校区,距离主校区 - 盐源4.5公里。万柳的学生必须乘坐公共汽车或骑自行车去学校。由于北京交通不畅,许多学生选择骑自行车。
我们可以假设除了“查理”以外的所有学生都以固定的速度从万柳到盐源。查理是一个有不同骑乘习惯的学生 - 他总是试图跟随另一个骑手,以避免单独骑车。当查理到达万柳大门时,他会找一个正在前往盐源的人。如果他找到某人,他将跟随那个骑手,如果没有,他会等待有人跟随。在从万柳到盐源的路上,如果一个更快的学生超过查理,他将随时离开他跟随的骑手并加快跟随更快的速度。我们假设查理到万柳门的时间是零。考虑到其他学生的出发时间和速度,你的任务是给Charley到达Yanyuan的时间。输入有几个测试用例。每种情况的第一行是N(1 <= N <= 10000),表示骑手的数量(不包括查理)。 N = 0结束输入。以下N行是N种不同骑手的信息,格式如下:Vi [TAB] Ti Vi是一个正整数<= 40,表示第i个骑手的速度(kph,每小时公里数)。 Ti是第i个骑手的起飞时间,它是一个整数并以秒为单位计算。在任何情况下都确保始终存在非负Ti。产量每个案例输出一行:查理的到达时间。在处理分数时向上舍入(上限)值。

这个题如果用模拟的办法将会非常复杂要考虑每次查理被超越时速度更换和每一次有人从出发到追上查理的时间(自己想着想着就把自己绕了进去)到了最后才知到,查理到达目标地点总是与最快的人时间相同。出发时间比查理早速度比查理快的查理是追不到的只需要先按时间排序先遍历将出发比查理晚速度比他慢的人删除 (也就是说查理就跟着耗时最短的)不多说了上代码。

#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int main()
{int j,q=0,s=0;double m,n,a,b;double k=4.5,c,d;while(cin>>m){if(m==0){break;}c=360000;for(int i=0;i<m;i++){cin>>a>>b;if(b>=0){s=ceil(4.5*3600/a)+b;   //从初发到终点的时间if(s<c){c=s;}}}cout<<ceil(c)<<endl;}
}

这篇关于ACM贪心总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1137276

相关文章

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo