首页 > 其他分享 >全国信息学奥林匹克联赛(NOIP2011)复赛提高组day2

全国信息学奥林匹克联赛(NOIP2011)复赛提高组day2

时间:2023-05-03 14:55:38浏览次数:46  
标签:yh NOIP2011 int day2 long 乘客 景点 复赛 mod

一、计算系数

首先对题目多项式进行简化分析

(x+y)2=x2+2xy+y2

(x+y)3=x3+3x2y+3xy2+y2

(x+y)4=x4+4x3y+6x2y2+4xy3+y4

不难发现它们的系数组成了一个杨辉三角

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

……

进一步带入则可得

(ax+by)2=a2x2+2abxy+b2y2

(ax+by)3=a3x3+3a2bx2y+3ab2xy2+b3y3

(ax+by)4=a4x4+4a3bx3y+6a2b2x2y2+4ab3xy3+b4y4

……

于是得(ax+by)k中xnym项的系数为(杨辉三角的第(k+1)行第(m+1)或(k-n+1)个的值*(anbm))的值

下面为代码:

#include<bits/stdc++.h>
#define mod 10007
using namespace std;
long long a,b,k,n,m;
long long yh[5010][5010];
int Pow(int x,int y){//计算幂
	long long r=1;
	for(long long i=1;i<=y;i++){
		r*=x;
		if(r>=mod)r%=mod;
	}
	return r;
}
void dfs(int x,int y){//杨辉三角
	if(y>x)dfs(x+1,1);
	else{
		yh[x][y]=yh[x-1][y]+yh[x-1][y-1];
		if(yh[x][y]>=mod)yh[x][y]%=mod;
		if(x==k+1&&y==m+1){
			cout<<(yh[x][y]*Pow(a,n)*Pow(b,m))%mod;
			return;
		}
		dfs(x,y+1);
	}
}
int main(){
	cin>>a>>b>>k>>n>>m;
	yh[1][1]=1;
	dfs(2,1);
}

二、聪明的质检员

三、观光公交

这道题本人主要就是贪心思想

首先记录每个景点最后一个乘客来到出发地的时间与这个景点(从前一个景点来)最迟到达时的时间。然后分析在哪个时刻使用氮气加速才是省时最多的(贪心):当这个景点的乘客开始等待时,公交还在来的路上,即这个景点的到达时间晚于最后一个乘客来到出发地的时候,使用氮气加速器可以减少乘客等待的时间。但也许会有很多个这种时候,所以要将它们记录下来,每次加速取省时最多的,再更新再继续进行此操作直到此时氮气加速器使用完(途中注意D[i]>0)

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int d[1010];
int t,a,b;
int num[1010],times[1010],wait[1010],rest[1010];
int ans=0;
int main(){
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)
	    scanf("%d",&d[i]);
	for(int i=1;i<=m;i++){
	    scanf("%d%d%d",&t,&a,&b);
	    wait[a]=max(wait[a],t);
	    ans-=t;
	    num[b]++;
	}
	for(int i=2;i<=n;i++)
	    times[i]=max(wait[i-1],times[i-1])+d[i];
	for(int i=1;i<=k;i++){
		for(int j=n;j>=2;j--){
		    rest[j]=num[j];
			if(wait[j]<times[j])rest[j]+=rest[j+1];
		}
		int maxn=-1,u=0;
		for(int j=2;j<=n;j++)
			if(rest[j]>maxn&&d[j]>0){
				maxn=rest[j];
				u=j;
			}
		d[u]--;
		for(int j=u;j<=n;j++)
		    times[j]=max(wait[j-1],times[j-1])+d[j];
	}
	for(int i=2;i<=n;i++)ans+=num[i]*times[i];
	printf("%d",ans);
}

其中有点难理解的地方:

ans:如果在后面减去t也没有问题,只是分开更简洁些

rest[]:如果在第i路段加速造福的乘客(能被减少等待时间的乘客数)

times[]:到达第i景点的时间

num[]:在第i个景点下车的乘客数

wait[]:第i个景点最后一个来到的乘客的时间

标签:yh,NOIP2011,int,day2,long,乘客,景点,复赛,mod
From: https://www.cnblogs.com/liuyi854854/p/17369055.html

相关文章

  • 23.5.2 NOIP2011 Day1提高游记
    今天做的比较得愉快快呢,除了第三题hh1.铺地毯这题我不做太多评价,纯纯的一道大水题。注意遍历数据的时候倒着遍历,还有就是不能用二维数组,会MLE。code:1#include<bits/stdc++.h>2#defineN100053usingnamespacestd;4inta[N],b[N],g[N],k[N];5inlinelongl......
  • qbxt day2
    DFS生成树对于任意一棵DFS生成树,其必定只有返祖边,没有横叉边,在求割点和强联通分量上方便很多。最小生成树求法:https://www.cnblogs.com/yifan0305/p/17363255.html严格次小生成树、非严格次小生成树。最短路问题Floyd求最短路、最小环,传递闭包。链接:在写着,会补得。......
  • Go-day2——go语言变量类型、常量、函数基础、函数高级
    目录一、go语言变量类型二、常量三、函数基础四、函数高级五、作业一、go语言变量类型#数字#int整数有正负int8int16int32int64 java byteshortintlong -int8一个字节表示(8个比特位)范围:-2的7次方到+2的7次方-1-int162个字节表......
  • JOISC2020 Day2 T3 遗迹
    考虑给你\(h\),怎么整体得到最后的\(a\)这里感觉不能去想让一个位置\(x\)留下来的冲要条件,不然可能就做不出来了。自然的想法:从$2n$到\(1\)遍历每个\(h_i\),然后从\(h_i\)到\(1\)找第一个没有标记的值\(x\),此时\(i\)能留下来,如果找不到\(x\),那么\(i\)无法留下来......
  • 每日一练 | 华为认证真题练习Day22
    1.基于ACL规则,ACL可以划分为以下哪些类?(多选)A.二层ACLB.用户ACLC.高级ACLD.基本ACL2.管理信息库MIB(ManagementInformationBase)是一个虚拟的数据库,这个数据库保存在NMS上。A.对B.错3.如下图所示,IPSec隧道模式中AH协议认证的范围是?A.1B.2C.3D.44.ARG3系列路由器上的AC......
  • 每日一练 | 华为认证真题练习Day23
    1.缺省情况下,P2P链路上OSPFv3HELLO报文的周期为多少秒?A.10B.20C.30D.402.组播地址FF02::2表示链路本地范围的所有路由器。A.对B.错3.IPv6报文的基本首部长度是固定值。A.对B.错4.IPv6地址2001:ABEF:224E:FFE2:BCC0:CD00:DDBE:8D58不能简写。A.对B.错5.路由器RouterD......
  • 每日一练 | 华为认证真题练习Day24
    1.SRGB(segmentroutingglobalblock):为全局segment预留的本地标签集合。在MPLS和IPv6中,SRGB均为全局标签预留的本地标签集合。A.对B.错2.SR(SegmentRouting)的产生的原因之一是因为传统的LDP存在一些制约其发展的因素,以下关于LDP的问题描述正确有哪些?A.LDP算路依赖与IGP,在IGP与......
  • 闲话 Day2
    今日份的闲话。接着凑数,写点比较显然的东西。通过日常做题可以观测到一些现象:上午做题效果明显好于下午(由通过的题目数量及难度统计得到)。如果模拟赛都是神仙题,则改完之后晚上非常困。摆烂一整天之后晚上几乎不困。不妨建立一个模型,每个人会存在一个值。叫什么呢,就叫脑......
  • redis高级-day2——redis哈希类型、redis列表类型、redis集合类型、redis有序集合类型
    目录一、哈希类型二、列表类型三、集合类型四、有序集合(zset)五、慢查询六、pipeline与事务七、发布订阅八、Bitmap位图九、HyperLogLog十、作业1、http协议详情,http协议版本,http一些请求头2、如何实现服务器给客户端发送消息,websocket是什么?用过吗3、悲观锁和乐观锁,如何实现一、......
  • 初学者代码训练Day2(c/c++)
    题目接收两个双精度浮点型数据 a 和 b。输出一个浮点数表示两数相加的结果。(结果保留两位小数)要求:创建两个浮点型变量 a,b。创建两个浮点型指针变量 pa,pb 并分别将其储存的地址设为 a 的地址和 b 的地址。不要使用 a+=b 而是通过指针将变量 b 的值加到变量......