NOIP 2011 Day2

tags:

  • 貪心
  • 模擬
  • NOIP
    categories:
  • 信息學競賽
  • 總結

計算系數

Solution

  根據二項式定理,
\[ \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\)需要用快速冪.
可以根據組合式的遞推公式算組合數.
\[C_n^m=C_{n-1}^m+C_{n-1}^{m-1}\]
或者是利用組合數的定義式,但是因為有取余, 所以要用逆元.
\[C_n^m=\frac{n!\mod 10007}{m!(n-m)!\mod 10007}=n!\times m!(n-m)!^{-1}\mod 10007\]
其中\(m!(n-m)!^{-1}\)為逆元, 這個可以直接用費馬小定理, 正好前面寫了快速冪, 豈不是美滋滋.

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;
}

聰明的質監員

Solution

  二分一個\(W\)含義如圖所示, 有一個重要的性質是\(W\)越大\(Y\)就越小, 根據這個計算\(Y\), 如果\(Y>S\), 說明如果\(W\)再大些, \(Y>S\)的值可能會更小; 如果\(S>Y\), 說明如果\(W\)再小些, \(S-Y\)的值可能會更小.根據這來調整\(W\).計算\(Y\)時需要先算出滿足\(\sum\limits_{j}\left[w_j>W\right]w_j,\sum_{j}\left[w_j>W\right]1\)的前綴和, 暴力算當然不行.

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

  這個題看起來可以用dp做, 但是能不能做就是另一回事了, 但是現在知道它可以用貪心做.它是怎么做的呢?實際上非常好考慮.
  首先, 每使用一次氮氣加速時, 目前在車上的有些人旅行時間會變短, 有些人會不變, 因為乘客上車的時間是不會改變的, 所以可能會在后面的某一站整車人都需要等一個乘客上車[判斷這個東西可以通過判斷從上一個點到達它的時間, 和最晚的乘客到達它的時間, 通過預處理完成這些操作], 在這之前下車的人旅行時間會變短.因此實際上這次氮氣加速只對不會受到等人上車影響的人有效, 也就是在它們上車之后直到下車都不會在某個站等別人上車的人是氮氣加速的受益者.
  因此想要快速處理這些問題, 我們需要一個站最近的需要等人的站,一個站被到達的時間和在這個站接完所有乘客的時間, 因為一次加速的受益者是在加速后和到達需要等人的站之間下車的人數, 那么還需要通過前綴和快速求出在某段時間下車的人數.然后在每次加速之后, 兩個站之間的行駛時間被改變了, 那么其它站被到達(并且接到所有乘客)的時間也可能被改變了, 所以需要重新更新一下一個站被到達的時間.
  不過并不知道為什么這樣的貪心策略是正確的?

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;
}

轉載于:https://www.cnblogs.com/qdscwyy/p/8728106.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453049.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS Code的golang開發配置 之 代碼提示

之前用VS Code的時候&#xff0c;發現自己的代碼的提示一直不好&#xff0c;換用JetBrain的Goland的代碼提示是好了&#xff0c;但是比較占用資源。在網上找了一些資料&#xff0c;發現很多人也是遇到第三方或者自己的代碼無法提示的情況&#xff0c;但是都沒有下文了。后來發現…

使用oprofile分析性能瓶頸

使用oprofile分析性能瓶頸 1. 概述oprofile 是 Linux 平臺上&#xff0c;類似 INTEL VTune 的一個功能強大的性能分析工具。其支持兩種采樣(sampling)方式&#xff1a;基于事件的采樣(event based)和基于時間的采樣(time based)。基于事件的采樣是oprofile只記錄特定事件&#…

什么是死鎖

死鎖是多個進程在運行過程中因競爭資源時產生的一種僵局。 各并發資源彼此等待對方擁有的資源&#xff0c;且在得到對方資源前不釋放自己的資源。

python數據工程師 面試題_阿里P7工程師耗時兩天整理的292道python大廠面試題,內含解析!...

前言相對于python大家應該都不會陌生吧&#xff01;現在java跟python可以算的是勢均力敵了&#xff0c;所以現在學習python 的小伙伴也是越來越多了&#xff0c;可是學完之后就能找到稱心如意的工作了嗎&#xff1f;很多小伙伴學習Python的時候感覺很簡單&#xff0c;但是到了去…

數組復制

在Java里面,可以用復制語句”AB”給基本類型的數據傳遞值,但是如果A,B是兩個同類型的數組&#xff0c;復制就相當于將一個數組變量的引用傳遞給另一個數組&#xff1b;如果一個數組發生改變&#xff0c;那么引用同一數組的變量也要發生改變。 1.使用FOR循環,將數組的每個元素復…

IntelliJ IDEA 對于generated source的處理

IntelliJ IDEA 對于generated source的處理 學習了&#xff1a;https://stackoverflow.com/questions/5170620/unable-to-use-intellij-with-a-generated-sources-folder 如果有generated source &#xff0c;例如使用gRPC過程中生成的&#xff0c;可以使用鼠標右鍵點擊使之成為…

產生死鎖的原因

一 競爭資源&#xff0c;但是資源的數目不能滿足進程的需要。 二 進程間推進順序非法&#xff0c;進程在運行過程中請求和釋放資源的順序不當。

fabric shim安裝合約_hyperledger fabric 開發第一個智能合約

一、編寫智能合約代碼HelloWorld.go&#xff0c;go語言實現&#xff0c;代碼很簡單&#xff0c;每個合約包含兩個方法&#xff0c;Init、Invoke。package mainimport ("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperled…

不能干一輩子開發???

程序員的職業生涯之我見 總是聽到下面的論調 程序員干不了一輩子&#xff01; 程序員怎么也不能干一輩子吧&#xff01; 在中國程序員還能干一輩子&#xff1f; 過了&#xff08;30&#xff09;40我就干不動程序員了&#xff01; 每每聽…

分布式緩存的25個優秀實踐與線上案例 done

楊彪&#xff0c;螞蟻金服技術專家&#xff0c;《分布式服務架構&#xff1a;原理、設計與實戰》和《可伸縮服務架構&#xff1a;框架與中間件》作者。近10年互聯網和游戲行業工作經驗。本文節選自即將出版的《可伸縮服務架構&#xff1a;框架與中間件》一書&#xff0c;作者&a…

服務器性能估算參考(硬件-應用服務器)

2019獨角獸企業重金招聘Python工程師標準>>> Environment(2013-05-24) two identical machines via a GB-Ethernet link a client machine generating HTTP requests with wrk as the load generator a server machine running the respective “benchmarkee”all …

產生死鎖的四個必要條件

&#xff08;1&#xff09;互斥條件&#xff1a;進程對所分配到的資源不允許其他進程進行訪問&#xff0c;若其他進程訪問該資源&#xff0c;只能等待&#xff0c;直至占有該資源的進程使用完成后釋放該資源 &#xff08;2&#xff09;請求和保持條件&#xff1a;進程獲得一定的…

下拉選擇_在管理Excel中實現聯動下拉選擇

在系統中常常出現這樣的情況&#xff1a;由于下拉選擇的數量太多了&#xff0c;難以高效選擇。為此管理Excel通過通過引入多級聯動選擇的方式來減少下拉選擇的困難度。先看下使用效果&#xff1a;聯動下拉選擇這個功能&#xff0c;在管理Excel中可以通過比較簡單的配置方法實現…

圖片預覽

// 預覽圖片yulanFn: function (e) {var arr [];var that this;//獲取當前圖片的下表var indexw e.currentTarget.dataset.indexw;var index e.currentTarget.dataset.index;//數據源var pictures this.data.banner[indexw].shoppingCarouselList;var picture "http…

風雨20年:我所積累的20條編程經驗

原文作者喬納森丹尼可&#xff08;Jonathan Danylko&#xff09;是一位自由職業的web架構師和程序員&#xff0c;編程經驗已超過20年&#xff0c;涉足領域有電子商務、生物技術、房地產、醫療、保險和公用事業。正如喬納 森在文中所言&#xff0c;本文適合剛畢業的大學生和剛入…

JS跨域(ajax跨域、iframe跨域)解決方法及原理詳解(jsonp)

這里說的js跨域是指通過js在不同的域之間進行數據傳輸或通信&#xff0c;比如用ajax向一個不同的域請求數據&#xff0c;或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不同&#xff0c;都被當作是不同的域。 下表給出了相對 http://store…

xenserver 安裝新硬盤_給Xenserver添加新硬盤

首先我們進入到xenserver的Console界面.然后按下enter進入命令模式,接下來.咱們先看看硬盤有沒有存在輸入fdisk -l出現如下提示:Disk /dev/sda: 500.1 GB, 500107862016 bytes255 heads, 63 sectors/track, 60801 cylindersUnits cylinders of 16065 * 512 8225280 bytesDevi…

go-study

package (包) 一個目錄下面所有的.go文件的包名必須相同. 包名一般和目錄名相同(是約定, 不是強制), 包名都小寫main包是一個特殊的包名, 在main包中, 必須包含func main()函數導入包(import)的時候, 使用的是包所在目錄的路徑, 路徑中不用包含包的名字, 在使用包的時候,直接用…

什么是系統安全狀態

指系統能按某種順序如&#xff08;P1&#xff0c;P2&#xff0c;...&#xff0c;Pn&#xff09;&#xff0c;來為每個進程分配所需要的資源&#xff0c;直至最大需求&#xff0c;使每個進程都可以順序完成。若系統不存在這樣一個安全序列&#xff0c;則稱系統處于不安全狀態。