"蔚来杯"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 -∑xiy=0 ......①

对b求偏导得b∑1 +k∑xi -∑yi=0  ......②  需要注意不要忽略了b的系数∑1

由②得b=(∑yi -k∑xi)/∑1  ......③

代入①得  k∑1 ∑xi2 +(∑yi -k∑xi ) ∑xi -∑1∑xiy=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

题目难度:

 




I


H

posted @ 2022-07-24 11:35  th-is  阅读(70)  评论(0)    收藏  举报