1. 程式人生 > 其它 >New Year Contest

New Year Contest

Rose

很有趣的題目一道

顯然的貪心就是按照時間順序做,先最耗時短的,零點前的都零點交,零點後的都做完就交

正確性怎樣保證呢

我們按照這個耗時進行排名後,假如交換兩個任務的話

如果這兩個任務都再零點前,沒有影響,

如果後一個任務跨零點了,那麼交換以後,後面的任務的罰時不會變,但前面的任務有可能也要罰時了,答案不可能更優

如果前一個任務跨零點,那麼交換以後,後一個任務罰時不變,前一個任務罰時更大,答案更差

如果兩個任務都在零點以後,顯然

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#define lll long long
using namespace std;
int n;
int a[100001];
int kt=350;
int lim=710;
int ans;
int cnt;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	int sum=0;
	for(int i=1;i<=n;++i){
		sum+=a[i];
		if(sum>lim){
			break;
		}
		cnt=i;
		if(sum<=kt){
			continue;
		}else{
			ans+=(sum-kt);
		}
	}
	cout<<cnt<<" "<<ans<<endl;
	return 0;
}