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.mzph.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;则称系统处于不安全状态。