zoukankan      html  css  js  c++  java
  • [六省联考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;
    }
    
  • 相关阅读:
    开发思路总结
    电脑蓝屏代码丢失,Eclipse这个功能帮我找回了代码
    书籍
    向日葵无法在控制端用键盘输入的原因
    js 多submit 不使其执行其他submit form
    js获取url参数值
    C# 正则表达式 去除HTML标签 C#后台
    读取txt文件 循环操作每行数据 添加到数据库
    Ubuntu中安装XAMPP出错的解决方法(转发,备查)
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/10513349.html
Copyright © 2011-2022 走看看