第一题。
题目
求满足如下条件的三角形个数:
1.周长为x
2.边长为整数
3.是直角三角形
数据量:x<1e5,时间1s
解析
如果直接暴力两条边,是O(n*n)的复杂度,显然无法全部通过。/
考虑上述三个条件,抽象得:
a+b+c=x
a*a+b*b=c*c
两个方程,三个未知数,所以只要确定一个变量就能算出其他两个。将方程进行处理得:
a=x(x-2b)/(2x-2b)
然后只需要枚举b,只要a为整数且a>0,且a<=b (这是为了去重)就answer++ ,不需要检查周长和直角三角形,因为公式已经包含了这两个条件。
AC代码
代码在家里,回去再贴
第二题
已知一个5*5矩阵:(题目给定写死)
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
41 42 43 44 45
现在从矩阵中取出相邻的6个数。两者相邻的意思是两者有一条公共边(题目就是这么说的)
然后题目输入若干1*6数组,形如:
1 2 3 4 5 11
1 2 3 4 5 6
请问,这些数是否是从矩阵中取出的数。
应该输出:
1
0
解析
好像太暴力的方法也过不了,说一下我的解决方案吧。
1.先给6个数排序,这样就容易判断一些条件。比如两两不相等。
2.根据一些特殊条件进行判断,如两两不能相等、数值不能低于1不能高于45,个位不能高于5不能低于1,十位不能高于4.等等
3.判断是否两两相邻,因为我们第二步已经去掉循环相邻,也就是有重复值的情况了,所以只需要判断他们是否能够连通。考虑并查集(考试时差点把并查集怎么写给忘了)。
AC代码
回去再贴代码
第三题
题目大意
有两个数组含义相同的数字但是顺序可能不同,每个数组内数字互不重复。现在要在数组一中删掉一部分数字(在数组二中相应删去对应的数字),要删掉尽量少的数字使两个数组完全相同。问最少删掉几个。
没做出来,主要是忘了公共子串的状态转移方程。(事实证明还是要多多复习啊)。最长公共子串(字符可以不连续的那个)
下面提示说用求两个串的最长公共子串的长度。
写写公共子串的方程吧
定义状态:
设dp[i,j]表示第一个串前i个字符和第二个串的前j个字符最长公共子串的长度。
状态转移方程:
若 s1[i] == s2[j] 有:dp[i,j]=dp[i-1,j-1]+1;
若 s1[i] != s2[j] 有:dp[i,j]=max( dp[i-1,j] , dp[i,j-1] )
初始化:
dp[0,i]=0;
dp[j,0]=0;