トピック説明:ZJMがあるのn ZJMはDDLの前に仕事をしていない場合、ジョブは、各ジョブは、独自のDDLを持って、その後、教師はこの仕事にすべての通常のポイントが差し引かれます。
だから、ZJMはできるだけビット以下の点をバックルして宿題の順序を調整する方法を知りたいです。
彼を助けてください!
入力:
T・テスト・ケースの入力。最初の入力ラインは、テストケースの数で発見された、単一の整数Tです。
各テストケースは、正の整数Nを開始する(1 <= Nは<= 1000)、 ジョブの数を示します。
次に、2本のライン。最初の行は、DDL、バックル点を表すN個の整数を含む次の行を表すN個の整数を含みます。
出力:
各テストケースについて、あなたは最小合計スコアの出力、各試験ラインを減らす必要があります。
例とヒント:
アイデアを問題解決:これは貪欲タイトル、我々は最大ヒープ・メンテナンスを使用して、最大の割合を維持し、この時点で、締め切りに直面したときに期限の最終日から列挙を開始し、我々は(彼らを)彼を置きます、そしてその日の初めまでに(最大を引き出し、最大ヒープ)のスコアを考え出すと、一日中、最大ヒープに追加。
列挙からわかるように、我々は数日後に前進し、最大スコアがそれから出てくるだろう期限を超過防止するが、ヒープに追加され、これはここに最善の方法になるのアイデアを与える必要があります:後ろから、日tで、我々は得点の山を取る必要があり、同じ日に、ベストを選択した後の時間tを追加し、あなたが出て(出てくるようになった前のt日で最大をしませ取らない場合には最適ではありませんtは現在のヒープの最大の日を思い付く場合)、結果は悪くなかった。低得点高い評価を獲得し、常に最高の、彼らの違いを得るチャンスは、到着のカットオフ日に(重要ではありません前に、我々は間違いなく)、高ポイントを取得する必要があります。
コード:
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
vector<pair<int,int> > h;
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.first>b.first;
}
int main()
{
int n;
cin>>n;
while(n--)//多组输入
{
priority_queue<int> q;//最大堆
int m,x;
cin>>m;
int total=0;
int cnt=0;
for(int i=0;i<m;i++)//h里面存的就是分数和日期
{
pair<int,int> u;
cin>>x;
u.first=x;
h.push_back(u);
}
for(int i=0;i<m;i++)//这个是总分数
{
cin>>x;
total+=x;
h[i].second=x;
}
sort(h.begin(),h.end(),cmp);//排个序,按照截止日期
int k=0;
for(int i=h[0].first;i>=1;i--)//维护最大堆
{
if(i==h[k].first)
{
for(k;k<h.size();k++)
{
if(h[k].first==i)
{
q.push(h[k].second);
}else
{
break;
}
}
}
if(!q.empty())
{
cnt+=q.top();
q.pop();
}
}
cout<<total-cnt<<endl;//输出丢的分
h.clear();
}
}