ACM好题汇总

 

 

本篇博客在距离2019icpc区域赛大约有一个月开始写,主要题目来自18-19HDU多校,当然也会有一些线上比赛的好题,水题签到题目就不整理,整理的为主要为高级思维题和在这之上多一层的算法题


 

1.

OJ题号

HDU6581

简单题意

有n+1辆车,属性有长度l,距离终点的距离s,速度v,问你最末尾的车偷到达终点的时间?

正解思路

思维:

如果距离终点远的车如果能赶上前面的车,则和前面的车粘在一起,则时间就变为黏在一起的车到终点的时间(注意是一起走的,所以直接算时间就行)。

二分:

二分枚举一下时间,判断是否可以到即可,判断函数需要点思维。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101053300


2.

OJ题号

HDU6586

简单题意

从原先字符串找到一个长度为n的子串,要满足给定的26个字母个数的上下界,且字典序最小。

正解思路

构造一个序列自动机nxt[i][j]表示i后面字符j的最近位置,因为要求字典序最小,所以我们对于每一个位置直接按字母顺序枚举,如果可以则check()立马填上,如果不可以继续往下走,一直找到长度为m即可。

check()细节:

  • 剩余的字母Ai在不超过Ri的情况下能构成n长度的串。
  • 原串剩余的字母Ai数量+已拿取字母Ai数量>=Li
  • 满足Li所需的长度小于剩余可添加长度

详细链接

https://blog.csdn.net/sdz20172133/article/details/102491999

 


3.

OJ题号

HDU6583

简单题意

题意:给定一个字符串,主角需要用打字机将字符串打出来,每次可以:

  • 花费 p 来打出任意一个字符。
  • 花费 q 来将已经打出的某一段(子串)复制到后面去。

正解思路

后缀自动机+DP

令我们设dp[i] 表示示已经打出前 i 个字符的最小花费。

对于第一种方案:显然有:dp[i]=dp[i−1]+p。

对于第二种方案,我们可以考虑维护一个j,使得 s[j+1……i] 是 s[1……j] 的子集(条件1),也就是说 s[j+1……i] 可以由 s[1……j] 中的一部分复制而来

具体实现利用后缀自动机来维护 s[1……j] 这个字符串,当不满足上述条件1时,就不断往后添加字符,并让 j = j + 1

当满足上述条件(1)时,就可以有:

               dp[i] = min(dp[i], dp[j] + q) 

具体细节:当找到满足条件的j时,记录在后缀自动机上最后的匹配位置,每次i或者j变化的时候,检查cur的link指针指向位置的终点集合长度是否大于等于已匹配长度,如果是,就可以往link指针方向跳,之后继续匹配。

详细链接

 

 

 


4.

OJ题号

HDU - 6599 

简单题意

给出一个长度为N的字符串,要求输出一个长度为N的数组A, A[i]表示长度为i的good substring的数量
good substring 的定义是 该子串是回文串,且该子串的一半也是回文串。询问长度为1~len的个数?

正解思路

 

回文树可以求出所有的本质不同的回文串的长度和在字符串结尾的位置,然后hash判断一下即可。注意,不需要把hash拆成四等分的,假如s1+s2为回文串,则s1与反转的s2相同,s1=s3+s4,s2=s5+s6,现在需要判断s3是否等于反转s4,反转的s4等于s5,所以只需要判断s1与s2是否相同。注意奇数偶数情况分开。

 

详细链接

https://blog.csdn.net/sdz20172133/article/details/100169175


5.

OJ题号

HDU - 6601

简单题意

题意:n 根木棍,若干次询问 [l,r] 区间内的木棍能组成的三角形的最大周长。

正解思路

首先,我们需要知道一个定理

这题的最大数为1e9,因为第44斐波那契数列已经查过了,所以我们只需要选出前44k的数就可以了(裸主席树)。然后贪心的考虑区间最大的三个数能否形成三角形,如果不能,考虑区间第 二大、第三大、第四大的三个数,以此类推,直到能形成三角形。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101515595

 


6.

OJ题号

HDU - 6602

简单题意

题意:求最长的连续子序列,满足序列中每个数至少出现 k 次或不出现。

正解思路

我们枚举右端点R,寻找满足题意的最远的左端点,假设我们当前要寻找k=3,

首先对于单个点来说,肯定有c-1种数满足答案,所以每个点来说初值为c-1.

你可能会疑惑62也是不满足为什么不加入,但我们是从前面递推过来的这个62会在它的2加上,满足的也同理。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101796123


7.

OJ题号

HDU - 6592 

简单题意

给出n 个数的序列 a[1]、a[2]、… 、a[n],找出 最长的单峰序列(先严格递增后严格递减,允许仅严格递增或仅严格递减)。要求分别输出所有最长的单峰序列 字典序最小 和 字典序最大 的序列(按其下标排序,输出时也是输出下标?

正解思路

 

本题解法有许多种,暂时提供一种线段树+贪心做法,我们首先考虑字典序最小的最长单峰序列,我们设置如下变量

参考:https://blog.csdn.net/Ratina/article/details/97273618

L[i][0]表示以a[i]为开头的最长递减子序列长度。
L[i][1]表示以a[i]为开头的最长单峰子序列长度。

有了上面的两个东西我们就可以确定最长单峰子序列长度max_len了

 

  • 求L[i][0]

  逆着 n 向 1遍历,然后求以a[i]结尾的最长严格递增子序列长度,可以二分维护LIS,也可以用线段树。

线段树离散化处理数组a,然后数的大小作为线段树下标,里面维护已有的最大的L[i][0]即可,则L[i][0] = query( 1, a[i] - 1 ) +1

 

  • 求L[i][1]

同样地从 n 向 1遍历,然后变为求以a[i]结尾的最长单峰序列长度,离散化后线段树维护。

以 数的大小作为线段树下标,里面 维护已有的最大L[i][1],(m表示数组a离散化后的最大值),则 L[i][1] = max( query(a[i] +1, m) + 1 , L[i][0] )(如果理解不了,看下面的图)。
 

  • 求字典序最小的具体方案

通过上面我们求出最长单峰子序列长度max_len,我们贪心的从1到n选取字符,对于当前字符a[i]来说,他可能有两种情况成为答案且如果能选就尽可能选(因为字典序最小)。

cnt:已选入答案的元素个数
pre:上一个放入答案的元素a

第一种情况:a[i]>pre&&L[i][1]==max_len-cnt

第二种情况:a[i] < pre&&L[i][0] == max_len - cnt
其他情况均不可放入。
 

对于字典序大的,可以将字符反转,然后按照上述过程求一遍,最后下标对应过去即可。

这题建议与:https://blog.csdn.net/sdz20172133/article/details/100162924

一起观看

详细链接

https://blog.csdn.net/sdz20172133/article/details/102561515


8.

OJ题号

HDU - 6606

简单题意

将一个长度为n的数组a[1]、a[2]、… 、a[n], 要求取前k段(要求各段连续,但不可交叉,每段元素个数≥1),使得最大的那段和最小,并输出该和。

1 <= n <= 2*105
1 <= k <= n
-109 <= ai <= 109

正解思路

最大值最小,所以这题的思路肯定为二分,但这题的a[i]有负数,所以贪心的判断函数肯定是不行的了。这题考虑DP

我们设dp[i]为前i个数可以得到最多满足条件的段数。

则dp[i]=max(dp[j])+1,  sum[i]-sum[j]<=x&&0<=j<i

但这样找是o(n^2)的,所以我们需要对其优化,因为要找前面的最大值所以线段树优化DP即可。

我们对于sum[i]离散化后建立权值线段树,维护最大权值dp[i],对于当前的sum[i],需要找到sum[j]>=sum[i]-x,所以直接查找即可(sum[i]-x,sum[i])的最大值即可。

详细链接

https://blog.csdn.net/sdz20172133/article/details/102577469

 


9.

OJ题号

HDU6609 Find the answer

简单题意

给 n 个数,前 i−1 至少要把几个变成 0 才能使前 i 项的和<= m。

正解思路

思路来自:https://blog.csdn.net/Ratina/article/details/97798320

对于每一个a[i],前缀和sum[i],

  1. 当sum[i]≤m,则ans[i]=0;
  2. 当sum[i]>m[i],我们就要删除1 ~ i-1的元素(变为0),为了删除的个数最少,很明显要优先删除大的元素,但暴力排序肯定不行,这里就要构建一棵权值线段树,找到构造成sum-m的最少元素。

对于权值线段树的建立,我们把a[i]离散化后构建权值线段树,但里面存储的是权值的个数和该权值的总和。

查询的时候就是查找sum-m最少是多少个权值相加,利用二分的思想在线段树上查找,大的值优先所以优先查找右子树。锁定分界点位置后依然需要用记录个数的权值线段树得到ans[i]。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101391192

 


10.

OJ题号

HDU - 6608

简单题意

给出一个质数P(10^9≤P≤10^14),找出最大的质数Q(Q<P),并求出Q!mod P

正解思路

因为质数分布很密,所以直接暴力找就行。

对于求Q!modP,

威尔逊定理:当P为质数,有(P-1)!=P-1(mod P)

则有:(P-1)(P-2).…(Q+1)Q!=P-1(mod P),只需要求得(P-1)(P-2)..(Q+1)在mod P下的逆元inv,inv乘以P-1,即可得到Q!
相乘会爆long long,要用快速乘。

详细链接

 

 


11.

OJ题号

 HDU - 6621 K-th Closest Distance

 

简单题意

给出一段长度为n≤1e5的序列a1,a2,…,an(a≤1e6),有m≤1e5次询问:L R p k问ax~an中与p的第K小个差值的绝对值是多少?

正解思路

对答案进行二分,对于可能的答案x,对al~ar构成的权值线段树查找[p-x,p+x]是否有K个(主席树实现),最后一次满足≥K的x既是答案。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101563693

 


12.

OJ题号

 HDU - 6620  Just an Old Puzzle

简单题意

八数码问题的变形,但格子是4*4的,输入一个数字网格,让你判断可否在120步内将网格的数字移动成为目标网格。

正解思路

算法进阶指南例题

1若格子列数为奇数,则逆序数必须为偶数。

2.若格子列数为偶数,且逆序数为偶数,则当前空格所在行数与初始空格所在行数的差为偶数。

3.若格子列数为偶数,且逆序数为奇数,则当前空格所在行数与初始空格所在行数的差为奇数。

详细链接


13.

OJ题号

Minimal Power of Prime

 HDU - 6623 

简单题意

询问n的分解后质因数的幂最小的是多少?
例如:108=2^2*3^3,所以质因数的幂最小是2

正解思路

我们首先筛出4000以内的质数(4000^5>=1e18),然后与n抵消部分,那么剩余的n只有4种情况。

  1. n=p^4   ans=min(4,ans)
  2. n=p^3   ans=min(3,ans)
  3. n=p^2,n=p1^2*p2^2=(p1*p2)^2    ans=min(2,ans)
  4.    其他还剩:n=p,n=p1^1*p2^2 , ans=min(1,ans)

计算x^(1/4)的四舍五入函数round(pow(1.0*x,1.0/4.0))更准确;

详细链接

 


14.

OJ题号

HDU - 6614  AND Minimum Spanning Tree

简单题意

n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&)。求最小生成树的边权和以及每个点的父节点?

正解思路

  • 如果是偶数,偶数的最后的二进制位为0,一定选择跟1相连,这样……0&1=0
  • 如果是奇数,优先选择跟最右边的0的位置的1000...相连,比如101011就跟000100相连因为这样x&y=0,注意特判一下如果对应的y>n取不到,那么我们选择y=1这样结果就是1。lowbit(x+1)就能取到最右边的0的位置

详细链接

 


15.

OJ题号

 HDU - 6616 Divide the Stones

简单题意

有 n颗石子,第 i颗重量为 i 。现在请你将这 n颗石子均分成 k 堆,每堆的重量和石子数量都一样。输出任意一种均分方式,如果不可以,输出 no 

正解思路

https://www.cnblogs.com/evlpsrfc/p/11285837.html

首先先特判:

  1.  k==1时,答案是yes和1~n;
  2. n==k && k!=1时 答案是no;
  3. 1~n的和不能整除k时 答案是no;

然后一般的情况:

  1. n/k为偶数时,答案就是头+尾这样,很简单;
  2. n/k为奇数时,可以先将前3k个石子分到相等的k份,然后剩下n/k-3(偶数)再头+尾即可。

 

详细链接

 



16.

OJ题号

HDU 6379

简单题意

一个人有QWE三个基础技能,和一个大招R技能,每释放一个基础技能就会获得一个相应的技能点,最多同时拥有三个技能点,最早获得的技能点会被最新释放的技能点给挤走,每次释放R技能,就会根据现有的三个技能点的组合,释放出一个特殊技能,但是释放R技能不会消耗目前拥有的技能点。技能点组合对应的特殊技能名称如上图所示。现给出一列按时间顺序释放的特殊技能,问如何释放基础QWE技能以及R技能,使得释放的技能总数最小。
 

正解思路

我们可以知道当前技能释放需要增加按键数,是通过是一个技能决定的,关键看上一个技能含有当前技能的QWE有几个,我们知道总共就有36种状态,我们设dp[i][j]为当前为i个技能由第j种状态得来,具体看一下代码,一看就懂。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101639267

 


17.

OJ题号

 HDU - 6624 fraction

 

简单题意

求出最小的正整数b,使得存在正整数a<b,满足a=bx(mod p),p、x已知,且p为质数,1<x<p≤10^15

正解思路

和解同余方程一样,把a=bx(mod p)转化为a=bx-py由于0<a<b,即0<bx-py<b,

可解得:

 

然后解上述不等式最小的正整数b和y即可,方法的话就是辗转相除法,可以看这里:传送门

详细链接

 

 


18.

OJ题号

 

链接:https://ac.nowcoder.com/acm/contest/1099/I
来源:牛客网
 

简单题意

Bobo有一颗n个点的树,点的编号是1,2…,2.树有(n-1)条边,第i条边的端点是ai和bi,权值是Ci.求满足u<v的(u,v)数量,满足点u到点v路径上的权值和是2019的倍数。

正解思路

dp[i][j]代表节点i的从叶子节点到节点i的路径为j的方案数,状态转移方程直接看代码,一看就懂,跑dfs即可。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101864843

 


19.

OJ题号

链接:https://codeforces.com/contest/1228/problem/C
来源:Codeforces Round #589 (Div. 2)

简单题意

对于一个 x ,prime(x) ={p1, p2…, pn},表示x可以整除那些素数.

g(x, p) 表示 x%max(p ^k)==0, max(p^k) = g(x, p) 。

f(x, n) = g(n, p1) × g(n, p2) ×···× g(n,pn),prime(x) ={p1, p2…, pn},p1, p2…, pn表示 x 的质因子。最后求出 f(x, 1) × f(x, 2) × ··· × f(x, n)。
 

正解思路

f(x,1)*f(x,2)*........f(x,n)=g(1,p1)*g(1,p2)*......g(1,pn)*  g(2,p1)*g(2,p2)*........g(2,pn) *.......* g(n,p1)*g(n,p2)*.......g(n,pn)

我们可以发现我们可以忽略最大的p^k条件,对于p1来说,我们求g(1,p1)*g(2,p1)*......*g(n,p1),[1,n]中可以整除p1的贡献一个p1,整除p1^2的又可以贡献一个p1.......

所以,n/p代表[1,n]可以整除p的个数,我们可以cnt=n/p+n/(p1^2)+.....+n/(p^n),p的答案贡献为p^cnt。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101937221

 


20.

OJ题号

链接:https://codeforces.com/contest/1228/problem/D
来源:Codeforces Round #589 (Div. 2)

简单题意

给一张n个点的无向图,无自环,不保证联通,问是否能三分这张图。对于每个集合的要求为,集合内部的点,两两之间不能有边相连,不同集合之间的点都需要有边相连。如果可以三分这张图,输出方案;如果不能,输出-1。

正解思路

这题首先分图有个特性,就是在一个集合的点周围连着点都是相同的,所以可以用Hash把一个点与周围其他点hash一下即可,最后有一个需要注意的地方是,如果一个点相邻节点哈希值为0,则不满足条件。

详细链接

https://blog.csdn.net/sdz20172133/article/details/101981168


21.

OJ题号

Gym 102056I - Misunderstood … Missing - [DP][The 2018 ICPC Asia-East Continent Final Problem I]

https://codeforces.com/gym/102056/problem/I

 

简单题意

有两种值A,D,A代表攻击一次怪兽能对怪兽造成的伤害。D代表每回合开始时A的增量。初始值均为0

给出三种操作,求使用这三种操作在n回合后可以达到的对怪兽伤害的最大值:

1.攻击怪兽,造成A+a[i]伤害。

2.不攻击怪兽,但使D增加b[i]。

3.不攻击怪兽,但使A增加c[i]。
 

正解思路

DP好题,这个讲的很好!https://www.cnblogs.com/dilthey/p/10132650.html

注意枚举攻击编号的时候,假设分别在p1,p2,p3, …… ,px处打出伤害,那么,会有伤害的额外值增加:(p1 - i + p2 - i + p3 - i + …… + px - i) * b[i] = (p1 + p2 + p3 + ……  + px - x * i) * b[i];那么,我们得去遍历(p1 + p2 + p3 + …… + px)的状态,这个状态其实可以看作:如果我们从后面开始向前面取的话,那么就是从N、N-1、N-2、…… 、N-j+1,等于(N + N - j + 1)* j / 2;同样的道理,我们可以去求最小状态,就是i、i+1、i+2、……、i+j-1,等于(i + i + j - 1) * j / 2;我们遍历这其中的状态,然后都用状态k减去j * i即可。
 

详细链接

https://blog.csdn.net/sdz20172133/article/details/102016684

 


22.

OJ题号

CodeForces - 1206D Shortest Cycle

简单题意

给n个数,(a[1]-a[n]),如果如果i!=j且(a[i]&a[j])!=0,则在i与j之间建边,求图的最小环(无向图最小环至少三个顶点)。

正解思路

由位运算AND的性质可知,如果 有3 个数的同一二进制位均为1,那么最小环的长度一定为3 。

如果要尽可能不出现3个数同一二进制位为1 11,如下:

1,10,10,100,100,1000,1000…

由于a的上限10^18  ,所以最多只有60位二进制,那么也就是说 如果非零数个数超过120,那么一定有3个数的同一二进制位均为1 ,即答案一定为3。

若非零数个数不超过120,则可以建图,然后用floyd算法求得最小环。

详细链接

 

 


23.

OJ题号

HDU6625 three arrays

简单题意

给出长度为n的两个序列a和b,对序列内随意排序,a[i]^b[i]=c[i],这样得到序列c,要求得出字典序最小的序列c。其中1≤n≤1e5,a,b=[0,2^30)

正解思路

要求字典序最小,那么只要贪心地从序列a,b中尽可能把异或值小的匹配全部选出来,然后从小到大排个序就是答案。

这个就可以很好地用01字典树实现了,先把序列a,b分别建成两棵01字典树,然后同时遍历,优先找同为0或同为1的(这样异或就可以尽可能地小),每次遍历完后删除这个值。

 

详细链接

https://blog.csdn.net/sdz20172133/article/details/102496070

 


24.

OJ题号

HDU6627 equation

简单题意

正解思路

这题需要一个高中数学思维, 绝对值是这个题的考点,所以需要知道如何去绝对值 ,由于知道了a,b数组,那么等于0 时 ,零点k可以求出来,排序一下。

当x <= k1时,所有的所有的绝对值内的都是负数,

当k1 <= x <= k2时, x1 的绝对值是正的 ,剩下的都是负的。

以此类推,分成n个区间来求即可。

接下来,我们从右往左遍历区间,每次把对应的a,b变成负的(先以正的形式全部加上得到suma,sumb,之后再从里面减去2倍的a,b即可),再验证一下解出来的x是不是在这个区间里面就行。
对于无穷多个解的判断,suma·x+sumb=C,当suma=0且C-sumb=0时,有无穷多的解。注意,仅当suma=0的话只是在该区间无解,应当继续判断。还要注意判断一下相同的区间。
 

详细链接

 

 


25.

OJ题号

permutation 1HDU - 6628 

简单题意

大意:给你两个数n,k,让你求出n的所有全排列中差异序列字典序第k小的排列差异序列为pi=a[i+1]-a[i].i属于[1,n)

正解思路

因为k最大为1e4,但8!=40000,所以n<=8,直接暴力全排列就行。

对于n>8的,最小的排列为n,1,2,3,....所以我们可以跑出后8位的排列,结构体排序输出。

详细链接

https://blog.csdn.net/qq_41117236/article/details/98516227

 


26.

OJ题号

string matching HDU - 6629 

简单题意

求字符串 s[i…len−1] and s[0…len−1] i>0 最长公共前缀长度求解过程的比较次数?

正解思路

扩展KMP的裸题。

https://blog.csdn.net/qq_41603898/article/details/98511883

https://blog.csdn.net/sdz20172133/article/details/99766858

详细链接

 

 


27.

OJ题号

HDU6630 permutation 2

简单题意

正解思路

思路一:

题意可以转换为:

在一个数轴上[1,N],1<=x,y<=N从x开始,每次可以向左(右)走1(2)步,最后1~N每点都走且只走一遍最后到达y的方法数。

我们首先假设x,y在中间则需要x->1,1->x+1,x+1->y-1,y-1->N,N->y且只能是这样路线,而且要x->1,1->x+1,y+1->N,N->y都是固定的,可以写几个样例看一下。
 

那么问题也就是对于x+1~y-1满足条件的排列有多少种。(当x!=1 && y != N时)

对于第i位的ai :第i+1位可以位ai+1或ai+2.

1:当第i+1位为ai+1时,继续往下讨论即可;

2:当第i+1位为ai+2时,第i+2位必然是ai+1,第i+3位必然是ai+3。否则如果以后在某一位再想回到ai+1,就走死了,回来了却无法回去。

由上可知,第i位可以由第i-1和第i-3位到达。此处用到斐波那契,f[i]=f[i-1]+f[i-3](f[1]=f[2]=f[3]=1)。

另外,如果x== 1 || y== N,我们只要从x出发或到y结束即可。

思路二:

打表,找到规律,会发现是f[i]=(f[-1]+f[i-3])%mod;

详细链接

 

 


28.

OJ题号

 HDU - 6641TDL

简单题意

f(n, m) 表示比n大的第m小的与n互质的数

给你k,m   求 (f(n,m)-n)^n = k的最小n

正解思路

枚举d,因为通过质数密度可以知道,一个数的与第一百个比他大且他互质的数之间的差值绝对不会超过1000。

详细链接

https://blog.csdn.net/sdz20172133/article/details/102497752

 


29.

OJ题号

 HDU - 6639 Faraway

简单题意

正解思路

感谢大佬:https://blog.csdn.net/Mannix_Y/article/details/98852365

我们去掉绝对值后,把每个点分为四个区域后,对于n个点,我们可以分为(n+1)*(n+1)个区域(0和m边界),然后再暴力枚举每一个区域,计算每个区域内符合条件的点数。

怎么计算每个区域内符合条件的点呢?

因为在每个区域计算,以每个区域的左下角(Lx[i], Ly[i] )作为起点,每次移动dx, dy的距离,其中 0 <= dx < lcm 并且 0 <= ly < lcm。

现在就走到了 ( Lx[i] + dx ,  Ly[i] + dy) 位置,然后check该点是否n个等式的条件,如果符合条件,我们就在该区域内找到了一个dx, dy小于lcm的特解,我们就可以就可以用 O(1) 的复杂度计算出在这个区域内与这个点相关的所有点的数量。

为什么要小于lcm?怎么计算相关的点的数量呢?

3%2=1

5%3=2

则3+n*6和5+n*6是一个答案

因为每知道了一个小于lcm的特解,我们就可以在这个点的基础上对x或者y加上一个lcm的倍数(前提是不会越界),此时得到的点也是一个满足条件的新解,所以我们只需要计算出该特解的x, y 能延伸几个lcm的距离,就能以 O(1) 的复杂度计算出在这个区域内与这个点相关的所有点的数量。
 

详细链接

 

 


30.

OJ题号

HDU6705 - path

简单题意

给出一个带边权有向有环图,含有n个结点m条边,共q次询问,每次询问在所有路径中第小的路径边权和是多少?(一条边可以走无限次)
·(1≤n,m,g,k≤5*1e4)

正解思路

讲得很好了

详细链接

https://blog.csdn.net/sdz20172133/article/details/100050877

 


31.

OJ题号

 HDU - 6651 Final Exam

简单题意

一共有n道题目,总分为m,学生为了得到x分的成绩需要学习x+1小时,对于任意情况分配给每一个题分数,需要对k道题目,求他最少复习多少时间?,

正解思路

大佬大佬:https://blog.csdn.net/weixin_43883326/article/details/99337171

详细链接

 

 


32.

OJ题号

 HDU - 6646 A + B = C

简单题意

题意为求a*10^x+b*10^y=c*10^z满足公式的任意一组解x,y,z。

正解思路

我们知道a+b的长度只有max(lena,lenb)或者max(lena,lenb)+1两种情况,所以我们一开始让abc的长度一样,分四种种情况枚举即可:

  • a与c对齐,枚举为b的初始长度到增加0后的长度
  • 可能会产生进位,a-1与c对齐,枚举为b的初始长度到增加0后的长度
  • 剩下两种把a与b倒换过来即可

但我们会找到一种反例,1110,100,1120,如果我们补齐11100,10000,11200,是得不到答案的,我们要补齐的111000,100000,112000,我们发现多补0是有好处的,而且我们发现100的00如果去掉一个0的话,那么可以直接出答案了,去掉它的,相当于增加1110,1120的,所以,我们需要我们把后缀0给补出来,初始的补齐长度:

             len=max(oldlen[3],max(oldlen[1]-suff_0[1],oldlen[2]-suff_0[2])+max(suff_0[1],suff_0[2])+1);

suff_0:后缀0的长度

oldlen:初始长度

详细链接

https://blog.csdn.net/sdz20172133/article/details/102483613

33.

OJ

CodeForces - 284E  Coin Troubles

题意


有n种硬币,现在我们需要凑出t价值的硬币,我们每种硬币都可以任取数量,不过要满足q个约束。

对于每个约束,(a,b)表示需要a种类的硬币使用的个数>b种类的硬币。

思路

如果num[u]>num[v],我们可以得出:

  • u至少选一个,因为如果u和v都不选,0,0也是不满足题意的,这一步我们可以把总价值t减少a[u]
  • val[v]+=val[u],因为t已经选择了一个u,所以对于v来说再选跟v一样数量的即可

最后注意谈判一下环即可。

详细链接

https://blog.csdn.net/sdz20172133/article/details/102471041


34.

OJ题号

2019牛客暑期多校训练营(第一场 )E.ABBA

https://ac.nowcoder.com/acm/contest/881/E

简单题意

构造求分解n个’AB‘和m个’BA‘子序列的合法序列个数。

正解思路

来自大佬:https://ac.nowcoder.com/acm/problem/blogs/51067


 贪心可得判断结论:每一个满足条件的字符串都必然满足前n个A与B匹配,后m个A与B匹配的这种分配情况,且不满足这样分配的字符串一定是错的。对于B来说一样。
  这样的话就可以进行dp,dp[i][j]表示现在来说有了i个A和j个B的合法字符串有多少种了。
  转移: 
  假设放A时,需要满足这第i个A是满足之前要求的
 即:如果i+1小于等于n的话随意放即可,因为这样做不需要对已经正确的“前状态”进行判定

  即: if(i+1<=n)  不需要做判定就对了;
  如果i+1大于n的话需要满足有足够的B(代表数量j)可以为多出来的A组成BA(后m个A为了组成BA而存在)
  即:if(i+1>n)  j 需要>= (i+1-n);            
  连立可得:能否放下此时的A只需要判断是否j>=(i+1-n)即可。
  B一样

 

详细链接

 


35.

OJ题号

富豪凯匹配串

https://ac.nowcoder.com/acm/contest/1114/C

简单题意

有n个长度为m的文本串,每个串只含有'0'和'1'。接下来有Q次询问,每次给出一个长度为m的字符串,且只含有'0','1'和'_'。如10_1_1。下划线可以匹配'0'或'1'。即10_1_1可以匹配101111,101101,100111,100101四种串。每次询问求出n个文本串中有多少个可以与当前询问的串匹配。

正解思路

我们利用&的性质:0&1=0,0&0=0,1&0=0,1&1=1

我们发现对于每一个查询str可以把第i位:_ 看成0(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=0

str可以把第i位:1看成1(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=1

str可以把第i位:0看成1(把str转化为s),s[i]&a[i]的匹配目标为t[i],t[i]=0

 

详细链接

https://blog.csdn.net/sdz20172133/article/details/102535030


36.

OJ题号

美味果冻

https://ac.nowcoder.com/acm/contest/1114/B

简单题意

求该式子

正解思路

交换一下确实没想出来,但是该打一下表的

 

详细链接

https://blog.csdn.net/sdz20172133/article/details/102535030


37.

OJ题号

https://ac.nowcoder.com/acm/contest/1085/F

牛客小白月赛17 F 小黄鸭

简单题意

小sun的寝室有一只小黄鸭,小黄鸭浮在水面上的样子特别可爱,现在小sun有一个问题:

为了简单,我们把小黄鸭视为一个均匀的球体,它浮在水面上的样子大概为:

图中黑色的线即为水平线,灰色的部分为没在水中的部分,现在你要求的是,这个球体浮在水面上的部分的高度(即为图中的h)。

高度定义为:一端在圆上,一端在水平线上且过圆心切垂直于水平线的线段长。

浮力定律:物体在液体中所获得的浮力,等于物体所排出液体的重量。(水的密度为1)

正解思路

题解思路

pvg=mg,v=m

其实下面部分就是一个球缺

球缺:

1.球缺曲面部分的面积(球冠面积)S=2πRH

2.s球缺体积公式V=(π/3)(3R-H)*H^2R是球的半径,H是球缺的高)

关于求解一元三次方程:https://blog.csdn.net/sdz20172133/article/details/102622042

详细链接

https://blog.csdn.net/sdz20172133/article/details/102622042

 


37.

OJ题号

牛客挑战赛33 C 艾伦的立体机动装置

https://ac.nowcoder.com/acm/contest/1115/C

简单题意

中文题

正解思路

  • 因为下表面是可以走的,所以不能直接算s点和t点展开的直线距离。
  • 枚举经过下表面的每一条边,再在每条边上三分求出最短距离。注意最短距离的初始值要设为不经过下表面任何一条边的最短距离。

slen记录每个顶点到s点的距离,getdis是获得上表面或下表面的两点距离,finddis是获得如果经过下表面某个点的路程距离,tridiv三分。因为我的下标是从0开始的,所以s点是p[s-1]。

对一条线段上的点进行三分操作

详细链接

 

 


37.

OJ题号

 

简单题意

 

正解思路

 

详细链接

 


37.

OJ题号

 

简单题意

 

正解思路

 

详细链接


37.

OJ题号

 

简单题意

 

正解思路

 

详细链接

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值