• [六省联考2017]期末考试(枚举)


    惊了,省选考枚举。
    显然,学生等待的代价只和最后一科成绩公布的时间有关。
    然后(b_ileq1e5)
    所以就可以枚举最后一科结束的时间(T)
    算出让最后一科在t时间出成绩的最小代价。
    取个(min)就行了。
    怎么求让最后一科在T时间出成绩的最小代价?
    (B<=A)时直接把所有公布时间大于(T)的科目,提前。
    否则消耗(A)的代价让公布时间小于(T)的科目往后推,不能再推了再消耗(B)的代价提前。
    丑陋的代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define int long long
    const int N=101000;
    int A,B,C,n,m,a[N],b[N],book[N],bok[N],w[N],cnt,tmp,num,tot,ret,ans=1e18;
    int read(){
    	int sum=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    	return sum*f;
    }
    signed main(){
    	A=read(),B=read(),C=read();
    	n=read();m=read();
    	for(int i=1;i<=n;i++)a[i]=read(),book[a[i]]++;
    	for(int i=1;i<=m;i++)b[i]=read(),w[b[i]]+=b[i],bok[b[i]]++;
    	sort(a+1,a+1+n);
    	sort(b+1,b+1+m);
    	if(b[m]<a[1]){printf("0");return 0;}
    	for(int i=1;i<=m;i++){
    		if(b[i]<a[1])tot+=b[i],num++;
    		else ret+=b[i];
    	}
    	cnt=0;tmp=0;
    	for(int i=a[1];i<=b[m];i++){
    		if(B<=A)ans=min(ans,tmp+(ret-(m-num)*i)*B);
    		else{
    			if(num*i-tot>=ret-(m-num)*i)ans=min(ans,tmp+(ret-(m-num)*i)*A);
    			else ans=min(ans,tmp+(num*i-tot)*A+(ret-(m-num)*i-(num*i-tot))*B);
    		}
    		cnt+=book[i];
    		tmp+=cnt*C;
    		if(tmp>=ans)break;
    		num+=bok[i];
    		tot+=w[i];
    		ret-=w[i];
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
  • 相关阅读:
    rdlc报表动态生成实例
    动态分页实现
    多文件上传
    文件压缩
    javascript解决中文传递乱码和特殊字符问题
    rdlc报表动态生成公共类
    SQLHelp类
    验证码
    使用bison和yacc制作脚本语言(3)
    C Mingw gcc printf 刷新缓冲行
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/10513349.html
Copyright © 2020-2023  润新知