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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NOIP 2011 Day2

發(fā)布時(shí)間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NOIP 2011 Day2 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

tags:

  • 貪心
  • 模擬
  • NOIP
    categories:
  • 信息學(xué)競(jìng)賽
  • 總結(jié)

計(jì)算系數(shù)

Solution

  根據(jù)二項(xiàng)式定理,
\[ \begin{align} (a+b)^n=\sum_{k=0}^nC_{n}^{k}a^kb^{n-k} \end{align} \]
那么
\[ \begin{align}(ax+by)^k=&\sum_{p=0}^kC_{k}^p(ax)^p(by)^{k-p}\\ =&\sum_{p=0}^k(C_{k}^pa^pb^{k-p})x^py^{k-p} \end{align} \]
\(a^n,b^m\)需要用快速冪.
可以根據(jù)組合式的遞推公式算組合數(shù).
\[C_n^m=C_{n-1}^m+C_{n-1}^{m-1}\]
或者是利用組合數(shù)的定義式,但是因?yàn)橛腥∮? 所以要用逆元.
\[C_n^m=\frac{n!\mod 10007}{m!(n-m)!\mod 10007}=n!\times m!(n-m)!^{-1}\mod 10007\]
其中\(m!(n-m)!^{-1}\)為逆元, 這個(gè)可以直接用費(fèi)馬小定理, 正好前面寫(xiě)了快速冪, 豈不是美滋滋.

Code

#include<cstdio> #define N 1005 #define mod 10007 using namespace std;#define int long long int c[N][N]; int a,b,k,n,m; int pow(int x,int y){int ans=1,pas=x;while(y){if(y&1)ans*=pas%mod,ans%=mod;pas=(pas*pas)%mod;y>>=1;}return ans%mod; }int dfs(int n,int m){if(!m)return c[n][m]=true;if(m==1)return c[n][m]=n;if(c[n][m])return c[n][m];if(n-m<m)m=n-m;return c[n][m]=(dfs(n-1,m)+dfs(n-1,m-1))%mod; }main(){//freopen("factor.in","r",stdin);//freopen("factor.out","w",stdout);scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);c[1][0]=c[1][1]=1;a%=mod;b%=mod;int ans=1;ans*=(pow(a,n)*pow(b,m))%mod;if(n>m)n=m;ans*=dfs(k,n)%mod;ans%=mod;/*for(int i=1;i<=k;++i){for(int j=0;j<=i;++j)printf("%d ",c[i][j]);printf("\n");}*/printf("%lld",ans);return 0; }

聰明的質(zhì)監(jiān)員

Solution

  二分一個(gè)\(W\)含義如圖所示, 有一個(gè)重要的性質(zhì)是\(W\)越大\(Y\)就越小, 根據(jù)這個(gè)計(jì)算\(Y\), 如果\(Y>S\), 說(shuō)明如果\(W\)再大些, \(Y>S\)的值可能會(huì)更小; 如果\(S>Y\), 說(shuō)明如果\(W\)再小些, \(S-Y\)的值可能會(huì)更小.根據(jù)這來(lái)調(diào)整\(W\).計(jì)算\(Y\)時(shí)需要先算出滿(mǎn)足\(\sum\limits_{j}\left[w_j>W\right]w_j,\sum_{j}\left[w_j>W\right]1\)的前綴和, 暴力算當(dāng)然不行.

Code

#include<cstdio> #define inf 999999999999 #define N 200005 #define int long long int ans; int n,m,s; int aaaa[N]; int sigma[N]; int v[N],w[N]; int le[N],ri[N];inline int abs(int s){return s>0?s:-s; } inline int min(int a,int b){return a<b?a:b; }bool check(int W){sigma[0]=aaaa[0]=0ll;int an=0ll;for(int i=1;i<=n;++i){sigma[i]=sigma[i-1];aaaa[i]=aaaa[i-1];if(w[i]>=W)sigma[i]+=v[i],++aaaa[i];}for(int i=1;i<=m;++i)an+=(sigma[ri[i]]-sigma[le[i]-1])*(aaaa[ri[i]]-aaaa[le[i]-1]);an=an-s;ans=min(abs(an),ans);return an>0; }main(){ans=inf;scanf("%lld%lld%lld",&n,&m,&s);for(int i=1;i<=n;++i)scanf("%lld%lld",&w[i],&v[i]);for(int i=1;i<=m;++i)scanf("%lld%lld",&le[i],&ri[i]);int l=0ll,r=s,mid;while(l<=r){mid=(l+r)>>1;if(check(mid))l=mid+1ll;else r=mid-1;}printf("%lld",ans);return 0; }

觀光公交

Solution

  這個(gè)題看起來(lái)可以用dp做, 但是能不能做就是另一回事了, 但是現(xiàn)在知道它可以用貪心做.它是怎么做的呢?實(shí)際上非常好考慮.
  首先, 每使用一次氮?dú)饧铀贂r(shí), 目前在車(chē)上的有些人旅行時(shí)間會(huì)變短, 有些人會(huì)不變, 因?yàn)槌丝蜕宪?chē)的時(shí)間是不會(huì)改變的, 所以可能會(huì)在后面的某一站整車(chē)人都需要等一個(gè)乘客上車(chē)[判斷這個(gè)東西可以通過(guò)判斷從上一個(gè)點(diǎn)到達(dá)它的時(shí)間, 和最晚的乘客到達(dá)它的時(shí)間, 通過(guò)預(yù)處理完成這些操作], 在這之前下車(chē)的人旅行時(shí)間會(huì)變短.因此實(shí)際上這次氮?dú)饧铀僦粚?duì)不會(huì)受到等人上車(chē)影響的人有效, 也就是在它們上車(chē)之后直到下車(chē)都不會(huì)在某個(gè)站等別人上車(chē)的人是氮?dú)饧铀俚氖芤嬲?/strong>.
  因此想要快速處理這些問(wèn)題, 我們需要一個(gè)站最近的需要等人的站,一個(gè)站被到達(dá)的時(shí)間和在這個(gè)站接完所有乘客的時(shí)間, 因?yàn)橐淮渭铀俚氖芤嬲呤窃诩铀俸蠛偷竭_(dá)需要等人的站之間下車(chē)的人數(shù), 那么還需要通過(guò)前綴和快速求出在某段時(shí)間下車(chē)的人數(shù).然后在每次加速之后, 兩個(gè)站之間的行駛時(shí)間被改變了, 那么其它站被到達(dá)(并且接到所有乘客)的時(shí)間也可能被改變了, 所以需要重新更新一下一個(gè)站被到達(dá)的時(shí)間.
  不過(guò)并不知道為什么這樣的貪心策略是正確的?

Code

#include<algorithm> #include<cstdio> #define N 10005 using std::max;int n,m,k,ans; int t[N],tm[N],l[N],r[N]; int ww[N],ws[N],ti[N],g[N];int main(){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<n;i++)scanf("%d",&t[i]);for(int i=1;i<=m;i++)scanf("%d%d%d",&tm[i],&l[i],&r[i]);for(int i=1;i<=m;i++)ww[l[i]]=max(ww[l[i]],tm[i]),++ws[r[i]];for(int i=1;i<=n;i++)ws[i]=ws[i-1]+ws[i];for(int i=2;i<=n;i++)ti[i]=max(ww[i-1],ti[i-1])+t[i-1];for(int i=1;i<=m;i++)ans+=ti[r[i]]-tm[i];if(!k){printf("%d\n",ans);return 0;}while(k--){g[n]=n;g[n-1]=n;for(int i=n-2;i>=1;i--)if(ti[i+1]<=ww[i+1])g[i]=i+1;else g[i]=g[i+1];int maxn=0,maxw=0;for(int i=1;i<n;i++)if(ws[g[i]]-ws[i]>maxn&&t[i]>0)maxn=ws[g[i]]-ws[i],maxw=i;t[maxw]--;ans-=maxn;for(int i=1;i<=n;i++)ti[i]=max(ww[i-1],ti[i-1])+t[i-1];}printf("%d\n",ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/qdscwyy/p/8728106.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的NOIP 2011 Day2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。