C语言(CED)智力大冲浪——贪心算法第一题

一、题目大意

小伟报名参加中央电视台的智力大冲浪节目,本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的!接下来主持人宣布了比赛规则:首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱!

输入:

输入文共4行。

第1行为m,表示一开始奖励给每位参赛者的钱;

第2行为n,表示有n个小游戏;

第3行有n个数,分别表示游戏1到n的规定完成期限;

第4行有n个数,分别表示游戏1到n不能在规定期限前完成的扣款数。

【输出】输出文件仅1行,表示小伟能赢取最多的钱

【sample input】

  10000

  7

  4   2    4   3   1   4   6

  70  60   50  40  30  20  10

【sample output】

  9950

二、大致思路

        这道题数据有很多,但是要学会排除掉多余干扰因素。因为要让剩余的奖金最大化,所以我们可以按照未完成游戏时所扣金额的大小排序(这里我按照从大到小进行排序),首先选择进行扣钱金额大的游戏。那么问题来了,每个游戏都有固定的截止时间,有很多扣钱大的游戏相互冲突,怎么办?相信很多人都会卡在这个问题上。我们可以通过以下方法实现所得奖金最大化:我们按上述方法排序后,从左到右遍历,能在对应时间段完成的,就完成;不能在该时间段完成的,就找一个在该游戏截止时间之前的时间段完成游戏,如果找不到,则放弃。

        下面以一个具体的例子进行遍历:

        游戏截止时间: 4    2     4    3    1    4    6

        游行名称:        A    B    C    D   E    F   G

         所扣金额:      70  60   50  40  30  20  10

   为了方便起见,我在这里就统一用时刻代表何时完成游戏(时刻和时间段不一样)。如上表所示,从左到右对游戏进行遍历,我们在4s进行A游戏2S进行B游戏,下一个游戏本来要在4s进行,但是4S已经被占用了,所以要向下(游戏截止前)找一个空余时间去完成该游戏,在对时间向下遍历的时候发现3S没被占用,所以用3S进行C游戏继续遍历,遇到D游戏,但是3S已经被占用,同理对时间向下遍历:2S不行,1S可以,所以用1S进行D游戏继续对游戏向右遍历,遇到E游戏,本来在1S进行,但是被占用了,然后对时间向下遍历,在1S前没有空时间,所以就放弃E游戏。对游戏继续遍历,同理F游戏也得放弃,最后的G游戏可以进行。整个遍历的过程就是这样,复杂度N方。

三、具体实现

        我用C语言写的代码,在代码开头,定义一个数组,并初始化为0,用来对各个时间是否被使用进行标记,1为使用。然后定义一个game结构体,并设置f(finish代表游戏截止时间),d(decrease代表罚金),p(position代表有一是否进行1表示进行,0代表未进行)三个属性。之后就是照着之前的分析进行代码设计。

#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<iostream>
using namespace std;
int  m;//代表开始奖励给每位参赛者的钱
int  b[6000] = { 0 };//记录时间段是否被使用,使用标记为1
//定义一个游戏结构体,存储游戏的属性
struct game
{int f;//表示游戏1到n的规定完成期限int d;//表示游戏1到n不能在规定期限前完成的扣款数int p = 0;//1表示对应的游戏已完成,0表示未完成
};
//用bool函数对排序依据的因素进行选择
bool cmp(game f, game d)
{return f.d > d.d;//选择罚款项进行非增序排序
}
//此函数为计算最小扣款函数
int compu(int n, game a[])
{sort(a, a + n, cmp);//对罚款进行非递增排序int i, j;//循环变量//外层循环对已排好序的游戏,进行从左到右的遍历for (i = 0; i<n; i++){//如果游戏对应的时间段没有被占用,则进行该游戏if (b[a[i].f] == 0){a[i].p = 1;//对游戏中是否完成的属性进行修改,表明该游戏已完成b[a[i].f] = 1;//对游戏使用的时间段进行标记continue;//进行下一个游戏的判断}//游戏对应的时间段已被占用else{for (j = (a[i].f - 1); j >0; j--){//表明找到空闲时间段完成本游戏if (b[j] == 0){a[i].p = 1;//对游戏中是否完成的属性进行修改,表明该游戏已完成b[j] = 1;//对游戏使用的时间段进行标记break;}//表明未找到空闲时间段完成本游戏,继续循环找elsecontinue;}}}return m;
}
int main()
{game a[6000];//定义游戏int n;//表示有n个小游戏cout << "请输入开始时奖励给每位参赛者的钱款金额:" << endl;cin >> m;cout << "请输入小游戏的个数:" << endl;cin >> n;int i = 0;//循环变量cout << "请输入每个游戏规定完成的期限:" << endl;for (i = 0; i <n; i++){cin >> a[i].f;}cout << "请输入每个游戏不能在规定期限前完成的扣款数:" << endl;for (i = 0; i < n; i++){cin >> a[i].d;}int sum = 0;//表示小伟的获奖金额sum = compu(n, a);for (i = 0; i < n; i++){if (a[i].p == 0)sum = sum - a[i].d;}if (sum < 0)sum = 0;cout << "小伟最多得奖的金额数为:" << sum << endl;system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言(CED)钢条最优切割收益

目录 一、题目大意 二、大致思路 三、具体实现 一、题目大意 一家公司购买长钢条&#xff0c;将其切割成短钢条出售&#xff0c;切割本身没有成本&#xff0c;长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。提示&…

撰写paper时,如何在word里输入图片或其他文献(PDF)里的公式?(更新时间2022.03.01)

我们在写paper时&#xff0c;经常会遇到在Word里编写数学公式的问题&#xff0c;其中大多数公式是已经存在的&#xff0c;所以只需要识别、复制、粘贴即可&#xff0c;那么接下来&#xff0c;我就介绍一下“Mathtype”“Mathpix”的方法&#xff0c;分为所需软件、软件操作、公…

家里接入某运营商300M宽带,为何网速还是很慢?(还未装修房屋的请进来)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 引言&#xff1a;家里接入300M的宽带&#xff0c;但是自我感觉网速不佳&#xff0c;遂结合所学知识&#xff0c;对此问题进行分析、研究和调察&…

(CED)列指针与行指针的联系与区别

一、列指针&#xff08;竖为列&#xff09; 1、列指针相关定义 列指针&#xff1a;被称为是指针变量指向二维数组的某个元素 一般使用时会有如下定义&#xff1a; int a[3][4]{1,2,3,4,5,6,7,8,9,10,11,12}; int *p;而上述代码定义的指针p&#xff0c;一般按照下表方式指向…

一、Pytho第一课——Python安装及配置路径方法(最详细小白教程,没有之一。如若不懂,不是还可以私信嘛!对吧?)

目录 一、下载软件 二、安装 三、编辑器 四、在Pycharm上成功运行Python程序&#xff08;配置Python解释器&#xff09; 一、下载软件 官方下载地址&#xff1a;https://www.python.org/downloads/&#xff08;打开似乎很吃力&#xff0c;必要时刻“挂灯”&#xff09; …

二、Python第二课——变量命名规则及字符串变量相关函数

目录 一、变量命名规则 二、字符串变量及相关函数 1、字符串变量 2、相关函数 最后琐碎杂物&#xff1a; 1、字符串之间的拼接 2、字符串格式控制&#xff08;制表符和换行&#xff09; 一、变量命名规则 正如其他编程语言一样&#xff0c;程序离不开声明变量&#x…

三、Python第三课——Python中数字的用法及编码原则(Python禅意)

目录 一、Python中的数字 1、整数 2、浮点数 3、整数、浮点数和字符串的联系和区别 二、编码原则 1、为代码增加注释 2、Python 禅意 A、编码精美 B、避繁就简 C、无简就繁 D、使用常规方法解决问题 E、先有效、再精巧、逐步升华 一、Python中的数字 编程中&#…

四、Python第四课——Python中列表及其操作(增删改查)

目录 一、Python中的列表 1、列表的定义和赋值 2、列表的使用 二、列表的“增删改查” 1、列表中元素的增加 A、在列表尾添加元素 B、在列表中插入元素 2、列表中“元素的删除” A、使用del语句删除元素 B、使用pop()函数删除元素 C、弹出列表中任何位置元素…

五、Python第五课——Python中组织列表的相关函数

目录 一、用sort()函数对列表进行永久排序 二、用sorted()函数对列表进行临时排序 三、用reverse()函数对列表进行列表原始排序的逆序输出 四、使用len()函数确定列表长度 创建列表后&#xff0c;内部的元素逐渐增多&#xff0c;其排列顺序也是无法预测的&#xff0c;因为…

如何正确下载、安装Codeblocks?

目录 一、Codeblocks的下载 二、Codeblocks的安装 三、Codeblocks的运行 相信很多同学在初学C语言时都会选择一个短小精悍的代码编辑器&#xff0c;如CodeBlocks&#xff08;不说别的了&#xff0c;直接切入正题&#xff09;。 在2020年&#xff08;今年&#xff09;3月份-…

Python:创建列表,其中包含数字1-1000000,为什么Pycharm控制台结果显示不完整?

目录 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 二、解决办法 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 在学习Python过程中遇到一个这样的问题&#xff0c;也算是一个小BUG吧。题目大意是这样的&#xff…

六、Python第六课——Python中的for循环及数字列表

目录 一、Python中的for循环 1、for循环语句的声明。 2、for循环缩进常见问题 二、数字列表 1、函数range() 2、使用range()函数创建数字列表 3、使用一系列函数处理数字列表&#xff08;统计&#xff09; 4、列表解析&#xff08;生成列表的简洁方法&#xff09; 一…

七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)

目录 一、切片 二、遍历切片 三、列表的复制 一、切片 此前&#xff0c;我们学习了如何访问单个列表以及如何处理列表中的所有元素&#xff0c;那么我们如何处理列表中的部分元素呢&#xff1f;这就引出一个概念“切片” 。我们可以把列表看成是面包&#xff0c;“切片”…

八、Python第八课——元组与列表、代码格式

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 一、元组的定义 二、元组的遍历 三、代码格式 一、元组的定义 1、元组&#xff1a;不可变的列表称为元组。这个是相对于普通列表而言的&#xff0c;普通列表…

九、Python第九课——Python中的if语句与运用

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 一、if语句 1、检查变量存储的值是否相等 2、判定字母或字符串时区别大小写 3、检查多个条件 4、检查特定值是否在列表中 二、if-else语句和if-elif-el…

十、Python第十课——字典的些许知识(重点)

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 &#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 初识字典 1、创建字典 2、字典的“增删改查” …

百度地图API如何申请?(自认为比较详细,如解决了你的问题请收藏、点赞、关注)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 注意&#xff1a;自己申请的AK要保存好&#xff0c;最好不要外借&#xff0c;避免不必要的麻烦&#xff01;&#xff08;写在前面&#xff09; 目…

PythonPyqt5项目开发完成后如何使用pyinstaller打包——以Pycharm编辑器为例(目前为止最正确的版本,成功打包日期为2020.11.26)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 最近用Python开发了一个可视化界面&#xff0c;开发过程如鱼得水&#xff0c;几乎没有BUG出现&#xff08;项目简单&#xff09;。但是在临近交付时…

十一、Python第十一课——用户输入和另一种循环(While)

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 学了这么久的Python&#xff0c;大家肯定会好奇&#xff0c;不是说机器学习吗&#xff1f;不是人机交互吗&#xff1f;不是人工智能吗&#xff1f;怎么我学了Python都十…

如何让新创建的Python文件自动生成作者信息等内容(以Pycharm为例)

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 打开Pycharm软件后&#xff0c;点击“File”&#xff0c;然后点击“Settings”&#xff0c;就会出现下面截图界面&#xff1a;然后按照箭头所指&#xff0c;在对应位置…