日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj千题计划262:bzoj4868: [六省联考2017]期末考试

發布時間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj千题计划262:bzoj4868: [六省联考2017]期末考试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.lydsy.com/JudgeOnline/problem.php?id=4868

?

假設 最晚出成績的是第i天

預處理 cnt[i] 表示 有多少個學生 期望出成績的那一天 <i?

sum[i] 表示 對應cnt[i] 那些學生 的 t 之和

比如 ?i=5,有4個學生 期望1 2 4 8 出成績,那么 sum[5]=1+2+4=7,cnt[5]=3

假設 最晚出成績的是第i天

學生的不愉悅度= (cnt[i]*i-sum[i])*C

類似的方法,算出 當前i下,能提前 某些 科目多少天,能推遲某些科目多少天

more_cnt[i] 表示有多少個科目 ?期望出成績的那一天 >i

more_sum[i] 表示 對應more_cnt[i]那些科目的 b 之和

less_cnt[i] 表示有多少個科目 ?期望出成績的那一天 <i

less_sum[i] 表示 對less_cnt[i]那些科目的 b 之和

需要提前的總天數=more_sum[i]-more_cnt[i]*i,記為need

可以推遲的總天數=less_cnt[i]*i-less_sum[i],記為have

如果B<=A,那就只 提前,不愉悅度為need*B

如果A<=B,看看可以推遲的 天數 是否>=要 提前的天數

如果>=,那就只 用A,不愉悅度為?need*A

否則,能用A的用A,剩下的用B,不愉悅度為?have*A + (need-have)*B

在預處理出那些數組后,所有的計算都是O(1)的,總時間復雜度為O(n)

?

三分可以把求解過程優化到 logn

?

注意有C=1e16,直接乘的話會爆long long

這種情況下一定是 提前科目出成績的時間,特判即可

?

考試的時候,特判錯了,丟了10分,w(゚Д゚)w

C=1e16,直接學生不愉悅度為 inf,應該是 最晚時間早于所有的期望時間,不愉悅度為0,其余的是inf啊啊啊啊

?

#include<cstdio> #include<iostream>using namespace std;#define N 100001#define min(a,b) ((a)<(b) ? (a) : (b)) #define max(a,b) ((a)>(b) ? (a) : (b))typedef long long LL;int t[N],b[N]; //subject int less_cnt[N],more_cnt[N]; LL less_sum[N],more_sum[N];//student int cnt[N]; LL sum[N];template<typename T> void read(T &x) {x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } }int main() {freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);int A,B,n,m; LL C;read(A); read(B); read(C);read(n); read(m);int x,mx=0;for(int i=1;i<=n;++i) {read(x);t[x]++;}for(int i=1;i<=m;++i) {read(x);b[x]++;mx=max(mx,x);}for(int i=mx-1;i;--i) {more_cnt[i]=more_cnt[i+1]+b[i+1];more_sum[i]=more_sum[i+1]+1LL*b[i+1]*(i+1);} for(int i=2;i<=mx;++i){cnt[i]=cnt[i-1]+t[i-1];sum[i]=sum[i-1]+1LL*t[i-1]*(i-1);less_cnt[i]=less_cnt[i-1]+b[i-1];less_sum[i]=less_sum[i-1]+1LL*b[i-1]*(i-1);}LL student,subject;LL ans=1e18;LL have,need;for(int i=1;i<=mx;++i){if(C<1e16) student=(1LL*cnt[i]*i-sum[i])*C;else {if(1LL*cnt[i]*i-sum[i]) student=1e18;else student=0;}if(B<=A) subject=(more_sum[i]-1LL*more_cnt[i]*i)*B;else {have=1LL*less_cnt[i]*i-less_sum[i];need=more_sum[i]-1LL*more_cnt[i]*i;if(have>=need) subject=need*A;else subject=have*A+(need-have)*B;}ans=min(ans,student+subject);}cout<<ans;return 0; }

?

?

轉載于:https://www.cnblogs.com/TheRoadToTheGold/p/8524840.html

總結

以上是生活随笔為你收集整理的bzoj千题计划262:bzoj4868: [六省联考2017]期末考试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。