"蔚来杯"2022牛客暑期多校训练营2


| A | B | C | D | E | F | G | H | I | J | K | L | |
| 赛时过题 | O | O | O | O | ||||||||
| 赛后补题 |
赛后总结:
不要盲目跟榜!不要盲目跟榜!不要盲目跟榜!E题很多人做但我们不会做,L题没啥人做但实际是简单题,D题J题一开始没啥人做实际上是板子题(不过都卡精度)。。。
比赛前1个小时~1个半小时每个人最起码看8道题!除非遇到思路非常清晰的题或者可以立刻动手写,其他题花10分钟左右思考思路然后再看看其他题。
一旦前期没有多开,到中期以后一旦在某题卡很久,由于沉没成本过大所有队员都卡在一道题将会导致其他可做题全丢!今天的L题就没做,实际上是可做题!
打比赛一定一定要确保可做题全做出来!最理想的状态是每道题都有2个队员去看过,如果2个队员都看不出来第3个队员也大概率不会做。
当2个队员卡在一道难题时,剩下的那个人一定要抓紧时间开其他题。
即:一道题花的时间超过半小时则立刻看其他题,队员在啃某道难题时自己一定要开其他题,不要三个人全部栽在一道题。今天这个E题是一道NTT,我们没人会,最后2小时等于是全部浪费了。
赛时排名:
5题末尾:176名
6题末尾:127名
7题末尾:98名
8题末尾:80名
G Link with Monotonic Subsequence
题目难度:check-in
题目大意:找出n的全排列中max( 最长上升子序列长度,最长下降子序列长度}最小的那个子序列。
题目解析:考场上发现很多人交了这题,且错误率很高,预计是一道结论题,很多人可能是猜错了结论。
于是我们选择了打表,很快发现可以把序列进行开根号分块,块内递减块间递增,这样最长上升子序列的长度=块的数量,最长下降子序列的长度=块的大小,答案就是ceil(sqrt(n))了。
参考代码:
查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Frd(i,a,b) for(int i=a;i>=b;i--)
int main()
{
int T;scanf("%d",&T);
while (T--)
{
int n;scanf("%d",&n);
int size=ceil(sqrt(n));
int cnt=(n+size-1)/size;
int flag=0;
For(i,1,cnt) Frd(j,std::min(size,n-(i-1)*size),1)
{
if (!flag) flag=1;else putchar(' ');
printf("%d",(i-1)*size+j);
}putchar('\n');
}
return 0;
}
K Link with Bracket Sequence I
题目难度:easy
题目大意:给定一个长度为n的括号序列a(不一定合法),询问有多少合法长度为m的括号序列b满足 a是b的子序列。T组数据。
数据范围:T<=100,1<=n<=m<=100,∑m<=1000
题目解析:一个b可能有多种方案可以匹配a,所以需要选择一种贪心的匹配方法:能取则取,保证一个b只会有一种方法得到a
令dp[i][j][k]表示 b序列长度为i,a序列匹配长度为j,b目前还有k个'('没有匹配。
则答案为dp[m][n][0]
状态转移方程:
s[j+1]='(':
第i+1位填'(':dp[i+1][j+1][k+1]+=dp[i][j][k]
第i+1为填')':dp[i+1][j][k-1]+=dp[i][j][k]
s[j+1]=')':
第i+1位填'(':dp[i+1][j][k+1]+=dp[i][j][k]
第i+1为填')':dp[i+1][j+1][k-1]+=dp[i][j][k]
边界情况:dp[0][0][0]=1
参考代码:
查看代码
#include<iostream>
#include<cstdio>
#define For(i,a,b) for(int i=a;i<=b;i++)
const int N=210;
const long long mod=1e9+7;
int n,m;
char s[N];long long dp[N][N][N];
int main()
{
int T;scanf("%d",&T);
while (T--)
{
scanf("%d%d%s",&n,&m,s+1);
if (m&1) {printf("%d\n",0);continue;}
int cnt=m/2;
For(i,0,m) For(j,0,n) For(k,0,cnt) dp[i][j][k]=0;
dp[0][0][0]=1;
For(i,0,m-1) For(j,0,n)
{
For(k,0,cnt-1) dp[i+1][j+(s[j+1]=='(')][k+1]=(dp[i+1][j+(s[j+1]=='(')][k+1]+dp[i][j][k])%mod;
For(k,1,cnt) dp[i+1][j+(s[j+1]==')')][k-1]=(dp[i+1][j+(s[j+1]==')')][k-1]+dp[i][j][k])%mod;
}
printf("%lld\n",dp[m][n][0]);
}
return 0;
}
J Link with Arithmetic Progression
题目难度:medium-easy
题目大意:n个点(xi=i,yi=ai),求一条直线y=kx+b满足 ∑(y-yi)2最小。
题目解析:实际上是最小二乘法,但是高中课本中的推导已经忘光了,因此这里采用高数中多维函数偏导来做这题。
F= ∑(y-yi)2= ∑(kxi+b-yi)2
=∑( (kxi+b)2-2yi(kxi+b)+yi2 )
=∑( k2xi2+2kbxi+b2 -2kxiyi-2byi+yi2)
=k2∑xi2 +kb∑2xi+b2∑1-k∑2xiyi-b∑2yi+∑yi2
对k求偏导得 k ∑xi2 +b∑xi -∑xiyi =0 ......①
对b求偏导得b∑1 +k∑xi -∑yi=0 ......② 需要注意不要忽略了b的系数∑1
由②得b=(∑yi -k∑xi)/∑1 ......③
代入①得 k∑1 ∑xi2 +(∑yi -k∑xi ) ∑xi -∑1∑xiyi =0
即 k(∑1∑xi2-∑xi∑xi)+∑yi∑xi -∑1∑xiyi =0
则k=(∑1∑xiyi-∑yi∑xi ) /(∑1∑xi2-∑xi∑xi)
代入③得 b=( ∑yi - ∑xi (∑1∑xiyi-∑yi∑xi ) /(∑1∑xi2-∑xi∑xi) )/∑1
参考代码:
D Link with Game Glitch
题目难度:medium-easy
题目大意:
L Link with Level Editor I
题目难度:
E
C
I
H

浙公网安备 33010602011771号