問題への羅区P1230ビッグサーフインテリジェンスソリューション

知性P1230サーフィン

タイトル説明

CCTV Xiaoweiは知性サーフィンプログラムを登録します。チャレンジは、各選手報いるため、すべての人の勇気の認識で司会多くの参加者を集め\(m個\)元。あまりにも幸せにしないでください!これらは必ずしもお金を払っていないので、あなたは何ですか?その後、ホストは、ゲームのルールを発表しました:

まず、ゲーム時間が分かれている\(N \)ピリオド\((n≤500)\) それはゲームの多くを与え、それぞれのゲームは、所定の期間内になければなりません\(TI \)完了前に(\ (1≤ti≤n)\) ゲームは所定の期間前に完了することができない場合は、からのインセンティブ報酬\(m個\)元はお金の一部控除\(のWi \)、\ (のWi \)の自然数、異なるゲームはお金が控除されていないですが同じ。もちろん、すべてのゲーム自体は、各参加者が一定の期間内に完了することができますが、全期間から開始しなければならないことを保証するために、非常に簡単です。司会はどれだけゲームを行うには、自分の組織の順序を調整するために、各参加者をクイズにしたいです。参加者として、Xiaoweiは、もちろん、ほとんどのお金を勝ちたい勝ちたいと思いました!注意:ゲームは、参加者がお金を失うことはできません!

入力形式

ファイルriddle.in、4行の合計を入力します。

最初の行動\(m個\)は、各参加者のお金へのご褒美の始まりを表し、

第二行動\(N \) 表現\(N \)小さなゲーム。

行3は、有している\(N \) 1ゲームへ、それぞれ、番号を\(N- \)を所定の期間が終了します。

4行目は持っている\(N- \) 1試合を、それぞれ、番号を\(N- \)を控除は、期限までに完了することができません。

出力フォーマット

出力ファイルriddle.out、一行のみ。彼はXiaoweiは、最もお金を獲得することができました表します。

サンプル入力と出力

入力#1

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

出力#1

9950

[思考]

ソート貪欲+
この貪欲非常に興味深いテーマである
前に行わクリアランスのゲームはレビューサイトを通じてに多少似ていること

私は貪欲な思考についてお話しましょう
貪欲、最終的に最善の解決策となるようもちろん、最高の地元のソリューションです
この質問のは、局所解の目的は、時間の単位ごとに最適なソリューションです
何が最善か?あなたが最もお金がそのゲームを差し引きます完了しない場合に完了することができ
、単位時間内ので、再び少ないお金が最低の条件の下で可能になりますが、
より多くのお金を残します

しかし、そこに難しさがあること少し質問です
私は時間点Aのタスクを持っている場合、私は時間の点aでできるということである- 1ダオ1.完了を
どの列挙正シーケンスの実行不可能性につながるが、私たちはしなければなりません列挙する
場所、ああ、見過ごすことは非常に簡単です
、あなたは、STLの魔法を使用することができます!
時点のバックの前にあるタスクはすべて行うことができますので
、プライオリティキューでそう、
現時点のそれぞれは、内部の優先度キューにタスクを完了し
た後、各時点をし、それらにお金マイナスの内側を与えました完了まで
以上にお金を引くことになります

残りのお金はちょうどそれを減算する必要があるの内側に、最後のプライオリティキューを減算する必要があります

[完了コード】

#include<iostream>
#include<cstdio>
#include<algorithm> 
#include<queue>
using namespace std;
priority_queue<int>s;
struct node
{
    int t,v;
}a[505];
bool cmp(const node x,const node y)
{
    return x.t > y.t;
}

int main()
{
    int n,m;
    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].v);
    sort(a + 1,a + 1 + n,cmp);
    int js = 1;
    for(int i = n;i >= 1;i --)
    {
        while(a[js].t >= i)
        {
            s.push(a[js].v);
            js ++;
        }
        if(!s.empty())
        s.pop();
    }
    while(!s.empty())
    {
        m -= s.top();
        s.pop();
    }
    cout << m << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/acioi/p/11609559.html