1 条题解
-
0
自动搬运
来自洛谷,原作者为

泅荼
**搬运于
2025-08-24 21:52:16,当前版本为作者最后更新于2018-05-15 09:25:44,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
看了看楼下题解好多都是三分大佬+一堆函数的分析qwq
注意到本题有一个特点,学生的不愉快度只与最晚公布成绩的时间有关
看看题目数据范围,ti,bi<=10^5
所以很自然地想到一种思路
枚举最晚公布成绩的时间
假设我们当前枚举的最晚公布时间为t,那么我们显然要把所以大于t的课程公布时间调为t即可。
此时根据A与B的关系分类讨论:
若A>B 显然将大于t的课程全部使用操作2调为t更优
若A<B 显然能使用操作1则使用,当不能使用(公布时间小于t的课程全部因操作1导致公布时间推迟到t)时,只能将剩下大于t的课程使用操作2处理
A=B随意
对于C,因为最晚公布时间为t,统计一下对不愉快度的贡献即可
具体实现用3个前缀和,对所有情况取min
时间复杂度O(max(bi))
我是直接从10^5开始枚举的这种做法不开unsigned long long 居然会挂两个点qwq
#include<cstring> #include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int N=100000+5; typedef unsigned long long ll; const ll inf=100000000000000000ll; ll bac[N],bac2[N],ti[N],bi[N],A,B,C,n,m; int main(){ scanf("%lld%lld%lld",&A,&B,&C); scanf("%lld%lld",&n,&m); ll sum1=0,t1=0,sum2=0,t2=0,sum3=0,t3=0; for(int i=1;i<=n;i++) scanf("%lld",&ti[i]),bac2[ti[i]]++,sum3+=ti[i],t3++; for(int i=1;i<=m;i++) scanf("%lld",&bi[i]),bac[bi[i]]++,sum2+=bi[i],t2++; ll ans=inf; for(ll i=100000;i>=1;i--){ sum1+=i*bac[i],t1+=bac[i]; sum2-=i*bac[i],t2-=bac[i]; sum3-=i*bac2[i],t3-=bac2[i]; if(!sum1)continue; ll tep=0; if(A<B){ ll LQ1=sum1-t1*i,LQ2=t2*i-sum2; tep+=min(LQ1,LQ2)*A; LQ1-=min(LQ1,LQ2); if(LQ1)tep+=LQ1*B; } else { ll LQ1=sum1-t1*i; tep+=LQ1*B; } tep+=(t3*i-sum3)*C; ans=min(ans,tep); } cout<<ans; return 0; }
- 1
信息
- ID
- 1324
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者