Week4의 [프로그램]을 DDL 작업의 생각과 실천의 공포

주제 설명 :

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;
}
게시 25 개 원래 기사 · 원 찬양 8 · 전망 (535)

추천

출처blog.csdn.net/weixin_44034698/article/details/104874140