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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

题解P3745期末考试

發布時間:2025/3/11 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 题解P3745期末考试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我太菜了,QAQ

Luogu


簡要分析

和洛谷的一篇分治的題解是一樣的想法(是我看的她的),我只是一個更詳細的代碼解釋,所以大家還是看洛谷題解吧

簡要說一下。貪心的選取。在C花費多的情況下,若A比B花費多,就一直用B,否則就用A。同理,若C花費少,就用C。

其次是貪心的判斷。選取時間點,看一看把所有的成績都提升至該時間點的是否可以。


所有的見代碼吧

#include<iostream> #include<cstdio> using namespace std; const int maxn=1e5+10; unsigned long long t[maxn],d[maxn],used[maxn]; unsigned long long c[maxn],up[maxn],n,m,A,B,C; //t[i]->時間上線為i的數目 unsigned long long flag,yes,last,x,ans; inline void prework(){long long val=0,tot=0;if(flag!=3)//如果不是C大到離譜for(register int i=1;i<=last;i++)val+=tot*C,tot+=t[i],c[i]=val;//統計C的結果看一看到i這個時間點不滿值是多少val=0;tot=0;for(register int i=1;i<=last;i++)val+=tot,tot+=d[i],used[i]=val;//看如果把時間線強行提到d[i],最多可以進行幾次Aval=0;tot=0;for(register int i=last;i>=1;i--)val+=tot,tot+=d[i],up[i]=val;//看如果把時間線強行提到d[i],最多要進行幾次提升 } inline void work(){//不用B的點long long now;ans=c[last];//如果一次提升也不進行,ans一直都是c[last]for(register int i=last;i>=1;i--){now=c[i];//枚舉最后一天if(used[i]>=up[i]) now+=up[i]*A;//如果這個點要提升的次數大于最多可以用A提升的次數//那你就無能為力了,所以此時直接退出else break;ans>now?ans=now:ans=ans;} } inline void work1(){ ans=0ll;long long QAQ=0;//只用A,B的點,不能讓學生等,//所以找到第一個有不滿意值的時候,把所有的都提升到這個時候之前就好for(register int i=1;i<=last;i++)if(t[i]){QAQ=i;break;}//首先找到一個需要提升的點//即這個點有不滿意值if(yes)//如果B>A 就先用Aif(used[QAQ]>=up[QAQ]) ans+=up[QAQ]*A;//如果A還可以再用一會兒else ans+=used[QAQ]*A+(up[QAQ]-used[QAQ])*B;//當A用完了的時候,就只用Belse ans+=up[QAQ]*B;//如果干脆A就B大,就只用B } inline void work2(){//毫無特色的點long long now;ans=c[last];for(register int i=last;i>=1;i--){now=c[i];if(yes)if(used[i]>=up[i]) now+=up[i]*A;else now+=used[i]*A+(up[i]-used[i])*B;else now+=up[i]*B;ans>now?ans=now:ans=ans;}//毫無特色的注釋 } int main(){scanf("%llu%llu%llu%llu%llu",&A,&B,&C,&n,&m);for(register int i=1;i<=n;i++) scanf("%llu",&x),t[x]++;for(register int i=1;i<=m;i++) scanf("%llu",&x),last=max(x,last),d[x]++;if(B>A) yes=1;if(A==1e9&&B==1e9) flag=1;else if(A!=1e9&&B==1e9) flag=2;else if(C==1e16) flag=3;prework();if(flag==1) printf("%llu",c[last]);else if(flag==2) work();else if(flag==3) work1();else work2();printf("%llu",ans);//毫無特色的主函數(除了壓行) }

轉載于:https://www.cnblogs.com/fallen-down/p/11594807.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的题解P3745期末考试的全部內容,希望文章能夠幫你解決所遇到的問題。

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