NOIP 2011 Day2
tags:
- 贪心
- 模拟
- NOIP
categories: - 信息学竞赛
- 总结
计算系数
Solution
根据二项式定理,
(a+b)^n=\sum_{k=0}^nC_{n}^{k}a^kb^{n-k}
\end{align}
\]
那么
=&\sum_{p=0}^k(C_{k}^pa^pb^{k-p})x^py^{k-p}
\end{align}
\]
算\(a^n,b^m\)需要用快速幂.
可以根据组合式的递推公式算组合数.
\]
或者是利用组合数的定义式,但是因为有取余, 所以要用逆元.
\]
其中\(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;
}
NOIP 2011 Day2的更多相关文章
- NOIP 2011 Day 1
NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...
- Noip 2011 Day 1 & Day 2
Day 1 >>> T1 >> 水题一道 . 我们只需要 for 一遍 , 由于地毯是从下往上铺的 , 我们只需要记录该位置最上面的地毯的编号 , 每一次在当前地 ...
- 【NOIP 2013 DAY2 T3】 华容道(spfa)
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- 【NOIP 2011】 观光公交
题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...
- NOIP 2012 Day2
tags: 扩展欧几里得 二分答案 查分 倍增 二分答案 贪心 NOIP categories: 信息学竞赛 总结 同余方程 借教室 疫情控制 同余方程 Solution 首先同余式可以转化为等式. ...
- noip 2011观光公交
P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 风景迷人的小城Y 市,拥有n 个美 ...
- noip 2011
铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺 ...
- 3730 无线网络发射选址[NOIP 0214 day2 T1]
3730 无线网络发射选址 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 查看运行结果 题目描述 Description 随着智能手机的日 ...
- NOIP 2015 DAY2
跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块 ...
随机推荐
- 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析
阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...
- BZOJ4566:[HAOI2016]找相同字符——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4566 https://www.luogu.org/problemnew/show/P3181 给定 ...
- [Leetcode] Binary tree level order traversal ii二叉树层次遍历
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- Emmet缩写语法
缩写语法 Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的 ...
- [Coding Practice] Maximum number of zeros in NxN matrix
Question: Input is a NxN matrix which contains only 0′s and 1′s. The condition is no 1 will occur in ...
- 利用枚举算法实现todoList:把对应项添加的内容列表
功能: 点击城市列表项,如果内容列表不存在,则插入点击项: 如果内容列表中已存在,则不插入,然后把内容列表中的对应项放到第一位. HTML代码: <!DOCTYPE html> <h ...
- Tomcat免安装版+Eclipse配置
Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程 重新记录下来,以便以后如果忘记了可以随时查看. 注意:首先要明确 ...
- mysql 压缩包免安装版 安转步骤
一. 下载 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本 ...
- 51Nod 1090 3个数之和
Input示例 7 -3 -2 -1 0 1 2 3 Output示例 -3 0 3 -3 1 2 -2 -1 3 -2 0 2 -1 0 1 #include "bits/stdc++.h ...
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...