1. 程式人生 > >智力大沖浪 【貪心】

智力大沖浪 【貪心】

題目描述

小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者 m 元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣佈了比賽規則:

首先,比賽時間分為 n個時段,它又給出了很多小遊戲,每個小遊戲都必須在規定期限前完成。如果一個遊戲沒能在規定期限 t 前完成,則要從獎勵費 m 元中扣去一部分錢 w,w​​ 為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!注意:比賽絕對不會讓參賽者賠錢!

輸入格式

輸入共四行。

第一行為 m,表示一開始獎勵給每位參賽者的錢;

第二行為 n,表示有 n 個小遊戲;

第三行有 n 個數,分別表示遊戲 1 到 n 的規定完成期限;

第四行有 n 個數,分別表示遊戲 1 到 n 不能在規定期限前完成的扣款數。

輸出格式

輸出僅一行,表示小偉能贏取最多的錢。

樣例

樣例輸入

10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10

樣例輸出

9950

資料範圍與提示

對於 100%所有資料,有 n ≤ 500,1 ≤ t ≤ n

 分析

扣款數多的肯定要先完成,但如何避免把扣款數高的題目過早完成而導致本來能完成的題目完不成了呢?

因為扣款數多的要優先完成,所以我們根據扣款數對任務從大到小進行排序,然後從第一個(扣款數最多的)任務開始,將他放到他能放到的最後期限去做,(目的是保證不出現前面的問題),排在後面可以為時間要求更高的任務留出時間。

程式碼如下:

#include <iostream>
#include <algorithm>
using namespace std;
typedef struct
{	
	int num;     	// num 表示完成期限 
	int count;   	// count 表示扣款數 
}goods;
int cmp(goods x,goods y)
{
	return x.count > y.count;
}
int main()
{
	int all,n,i,book[501]={0},t;
	goods a[501];
	
	cin >> all;
	cin >> n;
	for(i=1;i<=n;i++)
		cin >> a[i].num;
	for(i=1;i<=n;i++)
		cin >> a[i].count;
	sort(a+1,a+n+1,cmp);
// 核心程式碼段 
// **********
	for(i=1;i<=n;i++)
	{
		for(t=a[i].num;t>0;t--)
		{
			if(book[t] == 0)
			{
				book[t] = 1;
				break;
			}
		}
		if(t == 0)
			all -= a[i].count;
	}
// ************
	cout << all << endl;
}