题解P3745期末考试
生活随笔
收集整理的這篇文章主要介紹了
题解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期末考试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统启动自动启动,linux系
- 下一篇: Java编写一个WebService并在