LA 4850 贪心

感谢SF巨和WH巨的指导。。

首先,YY得到一个结论,罚值最大的最小值必定是按照截止时间排序得到的。然后,选一个任务插到其他位置,必定产生罚值最大值更大的情况,但有可能产生两个罚值最大情况和更小的情况(此处感谢WH巨)。然而,为什么不是选两个任务调动呢?因为必定会产生两个罚值更大的情况,情况会更坏。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=505;

struct mis{
	int s,t;
}mission[N];

bool cmp(mis a,mis b){
	if(a.t<b.t) return true;
	else if(a.t==b.t){
		if(a.s<b.s) return true;
	}
	return false;
}

int gao(int cur,int to,int n){
	int sum=0,cnt=0;
	int max1=0,max2=0;
	for(int i=0;i<=n;i++){
		if(cnt==to){
			sum+=mission[cur].s;
			max2=max(max2,sum-mission[cur].t);
			if(max2>max1) swap(max1,max2);
		//	cnt++;
		}
		if(i!=cur&&i!=n){
			sum+=mission[i].s;
			max2=max(max2,sum-mission[i].t);
			if(max2>max1) swap(max1,max2);
			cnt++;
		}
	}
	return max1+max2;
}

int main(){
	int T,n;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d%d",&mission[i].s,&mission[i].t);
		}
		sort(mission,mission+n,cmp);
		int ans=gao(-1,10000,n);
	//	cout<<ans<<endl;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				ans=min(ans,gao(i,j,n));
			//	cout<<ans<<endl;
			}
		}
		printf("%d
",ans);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4563035.html