zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    sql 查询某个字段出现的次数
    Spark性能优化指导及总结
    数据结构与算法基础-排序
    数据仓库中数据模型之拉链表
    Hive over()窗口函数及应用实例
    dubbo 分布式服务框架
    netty 网络框架
    实现JavaScript继承
    【ThoughtWorks西安】澳洲业务线招聘大量C#开发工程师
    使用Docker搭建自己的GitLab服务
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4563035.html
Copyright © 2011-2022 走看看