【C++】「一本通 1.1 例 5」智力大沖浪

【來源】

一本通題庫-1426
LibreOJ-10004
vjudge

【題目描述】

小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了衆多參賽者,主持人爲了表彰大家的勇氣,先獎勵每個參賽者mm元。先不要太高興!因爲這些錢還不一定都是你的。接下來主持人宣佈了比賽規則: 首先,比賽時間分爲n個時段(n500)(n≤500),它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成(1tin)(1≤t_i≤n)。如果一個遊戲沒能在規定期限前完成,則要從獎勵費mm元中扣去一部分錢wiw_iwiw_i爲自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作爲參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢! 注意:比賽絕對不會讓參賽者賠錢!

【輸入格式】

輸入共44行。

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

第二行爲nn,表示有nn個小遊戲; 第三行有nn個數,分別表示遊戲1n1~n的規定完成期限;

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

【輸出格式】

11行。表示小偉能贏取最多的錢。

【輸入樣例】

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

【輸出樣例】

9950

【數據範圍】

n5001tinn≤500,1≤t_i≤n

【解析】

貪心。

題意簡單地說就是給你m元錢讓你做n個任務,每一個任務要花一整天做,而且每個任務都有自己的截止日期,若是在截止日期之前沒做完會扣掉相應的錢。

目的是爲了得到更多的錢,就需要扣最少的錢,所以要將扣錢當作首要來考慮,再去考慮截止日期。按扣錢數由大到小,截止日期由大到小排序。因爲錢數越大越重要,截止日期越靠後,完成它的時間就越長。定義一個vis數組來標記是否用過那天,每一個物品都從截止日期往前搜索直到有一天沒有用過。越晚做越好,因爲我不僅能做,還不佔用前面的時間。若是沒有符合條件,則扣錢。

【代碼】

#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3,"Ofast","inline")

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>

#define RI                 register int
#define re(i,a,b)          for(RI i=a; i<=b; i++)
#define ms(i,a)            memset(a,i,sizeof(a))
#define MAX(a,b)           (((a)>(b)) ? (a):(b))
#define MIN(a,b)           (((a)<(b)) ? (a):(b))

using namespace std;
 
typedef long long LL;
  
int const N=505;

struct Node {
    int t,w;

    bool operator < (const Node &rhs) const {
        return w>rhs.w;
    }
} a[N];

int m,n;
int vis[N];

int main() {
    scanf("%d%d",&m,&n);
    for(int i=1; i<=n; i++) scanf("%d",&a[i].t);
    for(int i=1; i<=n; i++) scanf("%d",&a[i].w);
    sort(a+1,a+n+1);
    int sum=0;
    for(int i=1; i<=n; i++) {
        int flag=1;
        for(int j=a[i].t; j>=1; j--) {
            if(!vis[j]) {
                flag=0;
                vis[j]=1;
                break;
            }
        }
        if(flag) {
            for(int j=n; j>=1; j--) {
                if(!vis[j]) {
                    vis[j]=1;
                    break;
                }
            }
            sum+=a[i].w;
        }
    }
    printf("%d\n",m-sum);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章