zoukankan      html  css  js  c++  java
  • 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;
    }
    	
     
    
  • 相关阅读:
    函数的扩展
    数组的扩展
    event(1)
    面试
    iframes
    浏览器CSS兼容
    BFC
    简单的一个轮播效果
    asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(二)
    我的web框架设计
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15361609.html
Copyright © 2011-2022 走看看