[C ++] "One Book 1.1 Example 5"知的サーフィン

【出典】

ワンパス質問バンク
-1426 LibreOJ-10004
vjudge

【タイトル説明】

XiaoweiはCCTVの大規模な知的サーフィンプログラムに登録しました。チャレンジは多くの参加者を魅了しました。全員の勇気を称えるために、主催者は最初に各参加者に報酬を与えました メートル メートル 元。最初はあまり幸せにしないでください!お金は必ずしもあなたのものではないからです。次に、主催者はコンテストのルールを発表しました:まず、コンテストの時間はn個のタイムスロットに分割されます 500 (n≤500) 、それは多くのミニゲームを与えました、各ミニゲームは締め切りtiの前に完了する必要があります 1 t (1≤t_i≤n) 締め切り前にゲームが完了しない場合、報酬料 メートル メートル から差し引かれた金額の一部 w w_i w w_i 自然数の場合、異なるゲームから差し引かれる金額は異なります。もちろん、各ゲーム自体は非常にシンプルで、各参加者が期間内に完了することができ、期間全体から開始する必要があります。ホストは、各競技者がゲームを編成する順序をどのように配置するかをテストしたかっただけです。Xiaoweiは競技者として、チャンピオンシップを獲得したいと考えています。もちろん、彼は最も多くのお金を獲得したいと思っています。注:コンテストでは、参加者がお金を失うことは決してありません!

【入力フォーマット】

合計を入力 4 4 行。

初演 メートル メートル は、最初に各参加者に授与されたお金を意味します。

第二幕 、示す ミニゲーム。3行目には ゲームを表す 1 1〜n 指定された期限。

4行目は ゲームを表す 1 1〜n 、所定の制限時間の控除前に完了することができません。

【出力フォーマット】

のみ 1 1 行。Xiaoweiが最も多くのお金を獲得できることを意味します。

【入力例】

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

【出力例】

9950

【データ範囲】

500 1 t n≤500,1≤t_i≤n

【分析】

貪欲。

簡単な意味は、nのタスクを実行するためにm元を与えることです。各タスクは1日で完了し、各タスクには独自の期限があります。期限より前に完了しない場合、控除されます対応するお金。

目的は、より多くのお金を獲得することです。最初に考慮してお金を差し引いてから、締め切りを検討する必要があります。控除額は多額から少額で、締め切りは大から小へと並べ替えられています。金額が大きいほど重要であり、締め切りが遅くなるほど、完了するまでに時間がかかります。vis配列を定義して、その日が使用されたかどうかをマークします。各アイテムは、期限から1日使用されなくなるまで検索されます。私はそれを行うことができるだけでなく、以前の時間を取り上げることもできないので、私がそれを行うのが遅いほど良いです。条件が満たされない場合、お金は差し引かれます。

【コード】

#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;
}

元の記事を106件公開 156 件を賞賛 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/Ljnoit/article/details/105387386