주제 설명 :
ZJM이있다 N 작업, 각 작업은 자신의 DDL을 가지고 ZJM는 DDL 전에 일을하지 않을 경우, 다음 교사가 모든 일반적인 점을이 작업을 공제합니다.
그래서 ZJM은 가능한 한 조금 덜 포인트 버클 숙제의 순서를 정렬하는 방법을 알고 싶어요.
입력 형식 :
T 테스트 입력. 제 1 입력 라인은 하나의 정수이고 T 테스트 건수에서 발견되었다.
각 시험은 양의 정수 N 시작 (1 <= N은 <= 1,000), 작업의 수를 나타낸다.
그런 다음 두 줄. 첫 번째 라인은 DDL, 버클 지점을 나타내는 N 정수를 포함하는 다음 행을 나타내는 N의 정수를 포함한다.
샘플 입력 :
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
출력 형식 :
각 시험의 경우, 출력은 최소 총 점수, 각 검사 라인을 감소한다.
샘플 출력 :
0
3
5
샘플 설명 :
위의 예제의 세 가지 세트가있다.
제 1 세트의 샘플의 경우, 세 가지 작업이 자신의 셋째 날, ZJM이 전혀없는 점, 그래서 0이 출력의 DDL 전에 단 하루 만에 이루어 않는 DDL있다.
샘플의 두 번째 세트의 경우, 세 가지 작업은 첫 날, 셋째 날, 첫날 DDL이다,있다. ZJM이 작업의 첫 번째 날에 만든 다음 날 할 두 번째 작업이, 3 점의 총 공제, 출력 3.
아이디어 :
최소 버클 포인트의 경우, 가능한 한 DDL 전에 비교적 많은 부분을 선택 작업을 할 수 있기 때문이다. 하루의 마지막 시작이 일을 주선 한 후에 따라서, 작업, DDL 하강 점수 내림차순으로 입력됩니다의 DDL 작업의 마지막 날에 우선 순위 큐에 누르면, 크기 우선 순위의 점수에 의해 결정, 큐가 비어 있지 않은 경우 모든 일에 배치 될 때까지 전날의 통과 후, 하루의 작동 준비의 가장 높은 우선 순위이다 최대 점수, 하루의 작업 DDL은 앞으로 큐를 밀었다. 마지막으로, 작업의 큐는 미완성 작품 여전히에서 공제 포인트가 될 것입니다 자신의 점수를 추가 할 것입니다.
코드 :
#include <iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int size=1e6+5;
struct ddl{
int date;
int score;
bool operator<(const ddl&b)const
{
return score<b.score;
}
};
ddl d[size];
bool cmp(ddl&a,ddl&b)
{
return a.date!=b.date?a.date>b.date:a.score>b.score;
}
priority_queue<ddl>qq;
int main(int argc, char** argv) {
int N;
cin>>N;
for(int ii=0;ii<N;ii++)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>d[i].date;
}
for(int i=0;i<n;i++)
{
cin>>d[i].score;
}
sort(d,d+n,cmp);
int last=d[0].date;
int i=0;
while(last>0)
{
for(;i<n&&d[i].date==last;i++) qq.push(d[i]);
if(!qq.empty())
{
qq.pop();
}
last--;
}
int count=0;
while(!qq.empty())
{
count+=qq.top().score;
qq.pop();
}
cout<<count<<endl;
}
return 0;
}