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

NOIP 2011 Day2相关推荐

  1. [NOIP 2011普及组 No.4] 表达式的值

    [NOIP 2011普及组 No.4] 表达式的值 [问题描述] 对于1 位二进制变量定义两种运算: 运算的优先级是: 1. 先计算括号内的,再计算括号外的. 2. "×"运算优先 ...

  2. NOIP 2011 Day 1

    NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...

  3. NOIP 2011 普及组初赛试题——答案、分析、错题记录

    NOIP 2011 普及组初赛试题 单项选择题-答案 第 1 题 在二进制下,1011001 + ( ) = 1100110. A. 1011 B. 1101 C. 1010 D. 1111 第 2 ...

  4. NOIP 2011 提高组 Day2 校模拟 7.11

    数论只会GCD 模拟只会猜题意 贪心只能过样例!!!!! 上午身体不适,基本上是强行趴在那写题.也不知道思路在哪个状态,看到T1第一想法居然连暴力都不是了.第一想法,居然是打表2333 T1: 计算系 ...

  5. NOIP 2012 Day2

    tags: 扩展欧几里得 二分答案 查分 倍增 二分答案 贪心 NOIP categories: 信息学竞赛 总结 同余方程 借教室 疫情控制 同余方程 Solution 首先同余式可以转化为等式. ...

  6. 题目:[NOIP 2011]计算系数

    题目描述 给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数. [数据范围] 对于 30%的数据,有0≤k≤10: 对于 50%的数据,有a = 1,b = 1: 对于 100% ...

  7. NOIP模拟day2 2020.10.30

    今天这题啊,难度肯定达到了,这真的是NOIP吗?不过质量还是高啊. T1 首先,题目看似第一要求边数目,第二才管权值.但我们不能就这样掉坑里了,去先找多少条边.注意到在一个连通块中,当边数最多时一定是 ...

  8. NOIp #2011

    http://files.cnblogs.com/files/radiumlrb/NOIP2011%E6%8F%90%E9%AB%98%E7%BB%84%E8%AF%95%E9%A2%98-day1. ...

  9. NOIP 2011 聪明的质检员-二分答案

    先解释一下这个式子: 就是说如果区间[Li, Ri] 中 wj>=w的个数 乘以 所有的wj>=w的价值的和. 那么我们可以二分w的值,通过Y与S的值来调整w, 具体来讲,只要当下的Y大于 ...

最新文章

  1. python解释器的安装步骤-Python本地及虚拟解释器配置过程解析
  2. JS高级:事件冒泡和事件捕获;
  3. hadoop之文件管理基本操作
  4. java调用qq接口_用java代码怎么去请求腾讯接口并返回值
  5. 大数据场景中语言虚拟机的应用和挑战
  6. 动态规划——最大子数组和(Leetcode 53)
  7. linux 登陆sybase_远程连接sybase 数据库 步骤
  8. js定时刷新页面数据
  9. v中国瓶装水市场营销状况与销售动态分析报告2022-2027年
  10. 高版本Matlab运行时//在当前文件夹或MATLAB路径中未找到文件//函数或变量 ‘xx‘ 无法识别//解决方法
  11. 如何让别人看不懂java代码_为什么你写的代码别人看不懂?
  12. 统一诊断服务(UDS)否定响应也可以被抑制
  13. 反射式、透射式空间光调制器简介
  14. 最凄美的爱情故事,让每对爱人更长久的文章!!
  15. 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)
  16. android生成图片不失真,Android的PdfRenderer类生成低质量图像
  17. 编程是门艺术_是编程艺术吗?
  18. 单片机dac c语言,基于单片机Stm32f103 DAC电流输出解决方案
  19. opencv打卡49:开运算 cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
  20. ZZULIOJ1086-1090Python解法

热门文章

  1. 【LeetCode - 443】压缩字符串(模拟)
  2. 【北航oj】(线段树取模运算)
  3. 一台linux上运行多个mysql_linux下同时运行多个mysql
  4. php工程导致系统蓝屏,经常蓝屏是什么原因
  5. mysql 优化配置 大批量数据插入_[译] MySQL 最佳实践 —— 高效插入数据
  6. java 线程 单例_多线程单例模式
  7. mysql索引详细介绍简书_Mysql索引介绍
  8. 多线程线程池的基本创建,使用方法
  9. Java 重写与重载
  10. 剑指offer:3-7记录