第一題。
題目
求滿足如下條件的三角形個數:
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;