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.pswp.cn/news/531094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531094.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言(CED)鋼條最優切割收益

目錄 一、題目大意 二、大致思路 三、具體實現 一、題目大意 一家公司購買長鋼條&#xff0c;將其切割成短鋼條出售&#xff0c;切割本身沒有成本&#xff0c;長度為i的短鋼條的價格為Pi。那給定一段長度為n的鋼條和一個價格表Pi,求鋼條的切割方案使得收益Rn最大。提示&…

C語言(CED)如何用sort函數根據結構體里的某一屬性進行排序

&#xff08;請先看置頂博文&#xff09;本博打開方式&#xff0c;請詳讀_liO_Oil的博客-CSDN博客_怎么把androidstudio卸載干凈 前幾天在編寫代碼的時候&#xff0c;突然要根據結構體的屬性進行從小到大的排序&#xff0c;這即是我寫這篇文章的導火索。 正如大家所知…

撰寫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;一般按照下表方式指向…

C語言(CED)C語言中雙引號和單引號的區別

最簡單的區別&#xff1a; 在字符型變量賦初值時&#xff0c;用單引號&#xff1b;為字符串變量賦初值時用雙引號&#xff01; 具體區別&#xff1a; 1、大小 單引號引起的一個字符&#xff0c;其大小為1個Byte。 雙引號引起的字符串&#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;。但是在臨近交付時…