NOIP2011 提高组 Day2
自测时间:2017.4.12 8:15——11:45
实际得分:100+0+0=100
期望得分:100+100+0=260
T2 符合要求的总价值*符合要求的总个数
写成:符合要求的总价值*区间总个数
T3 正解贪心,DP式子退错了
http://cogs.pro/cogs/page/page.php?aid=16
T1 计算系数
时间限制:1 s 内存限制:128 MB
【问题描述】
给定一个多项式 (ax+by)^k ,请求出多项式展开后 x^n*y^m 项的系数。
【输入】
输入文件名为 factor.in。
共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。
【输出】
输出文件名为 factor.out。
输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007 取模后的结果。
【输入输出样例】
factor.in
1 1 3 1 2
factor.out
3
【数据范围】
对于 30%的数据,有 0≤k≤10;
对于 50%的数据,有 a=1,b=1;
对于 100%的数据,有 0≤k≤1,000,0≤n,m≤k,且n+m=k,0≤a,b≤1,000,000。
递推杨辉三角
按x的指数升序排列,杨辉三角中第k+1行,m+1列为 (ax+by)^k 展开后 x^n*y^m项的系数
ans=f[k+1][m+1]*a^n*b^m
#include<cstdio>
#define mod 10007
int a,b,k,n,m,ans=;
int f[][];
using namespace std;
void mul(int a,int b)
{
a%=mod; b%=mod;
for(;b;b>>=,a=a*a%mod)
if(b&) ans=ans*a%mod;
}
int main()
{
freopen("factor.in","r",stdin);
freopen("factor.out","w",stdout);
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
for(int i=;i<=k+;i++) f[i][]=;
for(int i=;i<=k+;i++)
for(int j=;j<=m;j++)
f[i][j]=(f[i-][j]+f[i-][j-])%mod;
mul(a,n);
mul(b,m);
ans=ans*f[k+][m]%mod;
printf("%d",ans);
}
#include<cstdio>
#define mod 10007
int a,b,k,n,m,ans=;
int f[][];
using namespace std;
void mul(int a,int b)
{
a%=mod; b%=mod;
for(;b;b>>=,a=a*a%mod)
if(b&) ans=ans*a%mod;
}
int main()
{
freopen("factor.in","r",stdin);
freopen("factor.out","w",stdout);
scanf("%d%d%d%d%d",&a,&b,&k,&n,&m);
for(int i=;i<=k+;i++) f[i][]=;
for(int i=;i<=k+;i++)
for(int j=;j<=m;j++)
f[i][j]=(f[i-][j]+f[i-][j-])%mod;
mul(a,n);
mul(b,m);
ans=ans*f[k+][m]%mod;
printf("%d",ans);
}
T2 聪明的质检员
时间限制:1 s 内存限制:128 MB
题目描述
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:
1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:
这批矿产的检验结果Y 为各个区间的检验值之和。即:Y1+Y2...+Ym
若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T
不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近
标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。
输入输出格式
输入格式:
输入文件qc.in 。
第一行包含三个整数n,m,S,分别表示矿石的个数、区间的个数和标准值。
接下来的n 行,每行2个整数,中间用空格隔开,第i+1 行表示 i 号矿石的重量 wi 和价值vi。
接下来的m 行,表示区间,每行2 个整数,中间用空格隔开,第i+n+1 行表示区间[Li,Ri]的两个端点Li 和Ri。注意:不同区间可能重合或相互重叠。
输出格式:
输出文件名为qc.out。
输出只有一行,包含一个整数,表示所求的最小值。
输入输出样例
5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3
10
说明
【输入输出样例说明】
当W 选4 的时候,三个区间上检验值分别为 20、5 、0 ,这批矿产的检验结果为 25,此
时与标准值S 相差最小为10。
【数据范围】
对于10% 的数据,有 1 ≤n ,m≤10;
对于30% 的数据,有 1 ≤n ,m≤500 ;
对于50% 的数据,有 1 ≤n ,m≤5,000;
对于70% 的数据,有 1 ≤n ,m≤10,000 ;
对于100%的数据,有 1 ≤n ,m≤200,000,0 < wi, vi≤10^6,0 < S≤10^12,1 ≤Li ≤Ri ≤n 。
检验结果随w的减小而增大,所以二分w判断检验结果与标准值的关系
#include<cmath>
#include<cstdio>
#include<algorithm>
#define N 200001
using namespace std;
int n,m,maxn;
long long s,sum[N];
int w[N],v[N],a[N],b[N],tot[N];
long long check(int k)
{
long long tmp=;
for(int i=;i<=n;i++)
if(w[i]>=k) sum[i]=sum[i-]+v[i],tot[i]=tot[i-]+;
else sum[i]=sum[i-],tot[i]=tot[i-];
for(int i=;i<=m;i++)
tmp+=abs(sum[b[i]]-sum[a[i]-])*(tot[b[i]]-tot[a[i]-]);
return tmp;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%lld",&s);
for(int i=;i<=n;i++) scanf("%d%d",&w[i],&v[i]),maxn=max(maxn,w[i]);
for(int i=;i<=m;i++) scanf("%d%d",&a[i],&b[i]);
int l=,r=maxn,mid;
long long ans1=1e15,ans2=1e15,tmp;
while(l<=r)
{
mid=l+r>>;
tmp=check(mid);
if(tmp<s) { ans1=s-tmp;r=mid-; }
else if(tmp==s) { printf(""); return ; }
else { ans2=tmp-s; l=mid+; }
}
printf("%lld",min(ans1,ans2));
}
T3 观光公交
时间限制:1 s 内存限制:128 MB
【问题描述】
风景迷人的小城Y 市,拥有n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第0 分钟出现在1号景点,随后依次前往2、3、4……n 号景点。从第i 号景点开到第i+1 号景点需要Di 分钟。
任意时刻,公交车只能往前开,或在景点处等待。
设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<bi)。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。
假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机ZZ 给公交车安装了k 个氮气加速器,每使用一个加速器,可以使其中一个Di 减1。对于同一个Di 可以重复使用加速器,但是必须保证使用后Di 大于等于0。
那么ZZ 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?
【输入】
- 输入文件名为bus.in。
- 第1 行是3 个整数n, m, k,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。
- 第2 行是n-1 个整数,每两个整数之间用一个空格隔开,第i 个数表示从第i 个景点开往第i+1 个景点所需要的时间,即Di。
- 第3 行至m+2 行每行3 个整数Ti, Ai, Bi,每两个整数之间用一个空格隔开。第i+2 行表示第i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。
【输出】
- 输出文件名为bus.out。共一行,包含一个整数,表示最小的总旅行时间。
【输入输出样例】
3 3 2
1 4
0 1 3
1 1 2
5 2 3
输出:10
【输入输出样例说明】
- 对D2 使用2 个加速器,从2 号景点到3 号景点时间变为2 分钟。
- 公交车在第1 分钟从1 号景点出发,第2 分钟到达2 号景点,第5 分钟从2 号景点出发,第7 分钟到达3 号景点。
- 第1 个旅客旅行时间 7-0 = 7 分钟。
- 第2 个旅客旅行时间 2-1 = 1 分钟。
- 第3 个旅客旅行时间 7-5 = 2 分钟。
- 总时间 7+1+2 = 10 分钟。
【数据范围】
- 对于10%的数据,k=0;
- 对于20%的数据,0<=k<=1。
- 对于40%的数据,2 ≤ n ≤ 50,1 ≤ m≤ 1,000,0 ≤ k ≤ 20,0 ≤ Di ≤ 10,0 ≤ Ti ≤ 500;
- 对于60%的数据,1 ≤ n ≤ 100,1 ≤ m≤ 1,000,0 ≤ k ≤ 100,0 ≤ Di ≤ 100,0 ≤ Ti ≤ 10,000;
- 对于100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100,0 ≤ Ti ≤ 100,000。
- 汽车最早到达景点i的时间get[i],
- 景点i最后一个游客出现时间last[i]
- 那么ans=Σ(get[b[i]]-t[i])=Σ get[b[i]]-Σt[i]
- Σt[i]是定值,所以要最小化Σ get[b[i]]
- d[i]表示从景点i-1到i所需时间
- 先算出不使用加速器的get :get[i]=max(get[i-1],last[i-1])+d[i]
- (从上一个景点的出发时间=到达上一个景点的时间 、 上一个经典游客的最晚出现时间 中较大的)
- 使用1个加速器 可以令答案减少 影响人数*1
- 所以枚举加速器,贪心的 用了加速器后影响人数 最多的地方
- sum[i]表示在景点i下车的人数
- data[i]表示 在景点i-1到景点i使用加速器可以影响的人数
- 初始data[i]=sum[i]
- 然后倒序枚举景点,若last[i]<get[i],(最后一个游客出现的时间比汽车到达时间早)
- data[i]+=data[i+1]
- 然后找到最大的data[i],d[i]--,更新get[]
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int t[],a[],b[],d[],data[];
int gett[],last[],sum[],g[],ans;
int main()
{
/*freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);*/
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t[i],&a[i],&b[i]);
last[a[i]]=max(last[a[i]],t[i]);
sum[b[i]]++;;
}
for(int i=;i<=n;i++) gett[i]=max(gett[i-],last[i-])+d[i];
//g[n]=n;
//for(int i=n-1;i>1;i--) g[i]= gett[i]>last[i] ? g[i+1] : i;
//for(int i=1;i<=n;i++) sum[i]+=sum[i-1];sum[n+1]=sum[n]+(sum[n]-sum[n-1]);
for(int i=;i<=m;i++) ans+=gett[b[i]]-t[i];
while(k--)
{
int maxn=,tmp=;
for(int i=n;i>;i--)
{
data[i]=sum[i];
if(last[i]<gett[i]) data[i]+=data[i+];
}
for(int i=;i<=n;i++)
//if(maxn<sum[g[i]+1]-sum[i]&&d[i]>0)
if(maxn<data[i]&&d[i]>)
{
//maxn=sum[g[i]+1]-sum[i];
maxn=data[i];
tmp=i;
}
ans-=maxn;
d[tmp]--;
for(int i=tmp;i<=n/*g[tmp]*/;i++) gett[i]=max(gett[i-],last[i-])+d[i];
//for(int i=g[tmp];i>=tmp;i--) g[i]= gett[i]>last[i] ? g[i+1] : i;
}
printf("%d",ans);
}
NOIP2011 提高组 Day2的更多相关文章
- [NOIP2011提高组day2]-3-观光公交
3.观光公交 (bus.cpp/c/pas) [问题描述] 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光 ...
- [NOIP2011提高组day2]-2-聪明的质监员
2.聪明的质监员(qc.cpp/c/pas) [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到 n 逐一编号,每个矿石都有自己的重量 wi 以及价 ...
- [NOIP2011提高组day2]-1-计算系数
1.计算系数 (factor.cpp/c/pas) [问题描述] k n m给定一个多项式(ax+by)^k ,请求出多项式展开后(x^n)*(y^m)项的系数. [输入] 输入文件名为 factor ...
- Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数
Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...
- [NOIP2011] 提高组 洛谷P1315 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- NOIP2011(提高组)DAY2---观光公交(vijosP1741)
描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...
- [Luogu1313][NOIP2011提高组]计算系数
题目描述 给定一个多项式 (by+ax)k(by+ax)^k(by+ax)k ,请求出多项式展开后 xn×ymx^n \times y^mxn×ym 项的系数. 输入输出格式 输入格式: 共一行,包含 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- 洛谷P1313 [NOIP2011提高组Day2T1]计算系数
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
随机推荐
- 推荐一个Markdown数学公式编辑器——Haroopad & Mathjax
要在Markdown里插入数学公式,如果没有好用的的引擎or编辑器,那么只能插入图片了,十分麻烦.这里推荐一个十分强大的数学公式引擎--Mathjax. 配置 有道云笔记目前不支持浏览MathJax公 ...
- Beta阶段——2
一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 昨天主要是对beta阶段的任务做了总结 (2) 今天计划完成的工作: 今天主要是对管 ...
- 使用docker-compose编排django、mysql实战
背景: 本萌最近在部署自己开发的项目的时候发现同一套代码上传到服务器上后,部分功能莫名其妙的有点问题,服务器的各项配置都没有做过变动,所以想把项目转战到docker. 奈何刚接触docker,很多地方 ...
- 设置session的过期时间
1)修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了 session.gc_maxlifetime = 86400 然后,重启你的web服务(一般是apa ...
- Android 目录结构
Android目录结构中,values目录下对应的是应用程序所需要的数据,网上看到了一个包含values-v11等values-*的写法. 是为了进行分辨率的自适应????????? 因为还没有涉及到 ...
- ACM数论之旅1---素数(万事开头难(>_<))
前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么区别,反正以后有关数学的知识我都扔进数论分类里面好了) 于是我就准备写一个长篇集,把我知道的数论知识和ACM模板都发上来(而且 ...
- C# id 字符串之类的拼接
背景 : id数组 [1,2,3,4,45,7] 要拼接字符串‘1’,‘2’,‘3’,看了同事自己写了代码 string+=‘,’ 之类的 头大 解决:string有静态函数 ,string.Jo ...
- C# QR二维码DEMO
QR二维码 二维码的一种 相关类库 ThoughtWorks.QRCode 第三方类库 DEMO功能 Encode 生成二维码图片 Encoding 编码 Correction Level 等级 Ve ...
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- Java线程Dump分析工具--jstack
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...