2016年湖南省第十二届大学生计算机程序设计竞赛

本文精选了五道算法竞赛题目并提供了详细的解题思路及代码链接。涉及倍数关系统计、有向无环图路径计数、动态费用计算、最长上升子序列构造以及字符串翻转求和等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.传送门:2016
题意:给出正整数n和m,统计满足以下条件的正整数对(a,b)的数量
1. 1≤a≤n,1≤b≤m;
2. a×b 是 2016 的倍数。

思路:
a*b是2016的倍数->a*b%2016=0->(a%2016)*(b%2016)%2016=0
->统计余数的个数

代码:http://paste.ubuntu.com/23131606/


B.传送门:有向无环图
题意:n个点,m条边的有向无环图,count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0),a,b 是给定的数列,求
ni=1nj=1count(i,j)a[i]b[j]%1e9+7

思路:因为是有向无环图,我们对于每个点都维护sum[u]表示从u出发能到达的所有v的count[v]*b[v]之和,那么u的一个后继v对sum[u]有sum[v]+b[v]的贡献,我们进行dfs就可以了

代码:http://paste.ubuntu.com/23131653/


D.传送门:Toll
题意:有向图,有n个点(n<=10),每条路的费用会随时间的变化而变化,费用为ci*t+di。可以认为车在路上行驶不花费时间,t只与出发时间有关。
求从1到n,在[0,T]这一段时间内出发,平均费用为多少这里写图片描述

思路:
所求的积分函数已经知道了,有上下界,利用simpson积分+最短路,带入求解
代码:http://paste.ubuntu.com/23140386/


E.传送门:最长上升子序列~
题意:一个长度为 n 的数列 p1,p2,…,pn.
用 1,2,…,n 来替换其中值为 0 的元素,使得 p1,p2,…,pn 互不相同(即 p1,p2,…,pn 是 {1,2,…,n} 的排列)。替换后最长上升子序列的长度恰好为 (n-1) 数列的数量。

思路:
p[i]表示第i个位置的数,如果数不确定,记为0
对n所要放的位置进行分类讨论
1)n的位置为n
->前面n-1个数构成一个LIS为n-1的序列

2)n位置为n-1
->在1~n-1的值中取出一个值放到第n个位置
判断第n个位置的数是否是确定的
如果是,判断前面n-1个位置能否组成LIS为n-1的序列

如果不是
找出最大的pos[i]=i和最小的j使得p[j]=j+1(i,j表示位置)
(如果j存在,表示位置从j到n之间所有的p[j]==0||p[j]==j+1,如果不存在,令j=n-1,因为n将要放在n-1这个位置,所以这个位置一定成立)
判断1~i之间是否所有的p[i]都为i或者-1
判断j~n之间是否所有的p[j]都为j-1或者-1

那么放到第n个位置的数有j-i个(位置在[i+1,j-1]+最后一个位置)
我们只需要判断[i+1,j-1]之间的数是否都为-1
如果不是,方案数为0,如果是,方案数为j-i

3)n位置既不为n,也不为n-1
找出最大的pos[i]=i和最小的j使得p[j]=j+1(i,j表示位置)
判断1~i之间是否所有的p[i]都为i或者-1
判断j~n之间是否所有的p[i]都为j+1或者-1

那么放到第n个位置的数有min(n-2,j-1)-i个(位置在[i+1,min(n-2,j-1)])
n的位置在[i+1,min(n-2,j-1)]之间,判断这个区间内的数是否都为-1
如果不是,方案数为0,如果是,方案数为min(n-2,j-1)-i

代码:http://paste.ubuntu.com/23140494/


H.传送门:Reverse
题意:给你一个字符串,全为数字,R(i,j)表示翻转从i到j的字符然后这个字符串对1e9+7的摸值,求 ni=1nj=iR(i,j)

思路:
我们对每一位上的数算贡献
对于每一位数从左到右标记为n-1,n-2,…,0
对第i位数考虑替换到第n-1,n-2,n-3…i+1,i位的贡献

先考虑第i位不替换的情况,有(n-i)*(n-i-1)/2+(i-1)*i/2中方法
替换到第n-1位有1中方法,第n-2位有2种,..,到了一个临界点之后方案数不会增多
然后就是一个等比数列
前面的是一个数列求和,类似i*10^i

代码:http://paste.ubuntu.com/23132796/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值