記錄week10的實驗兩道題 作業三道題

2021-10-05 11:14:44 字數 3712 閱讀 2326

簽到題、lis & lcs、 拿數問題 ii、簽到題、東東轉魔方

作業:

簽到題:

題意:

在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出-1。

思路是:將m除以n,判斷是否能整除,若能則繼續除以三,不能就除以二,直到最後,如果能除盡了就ok(要用longlong

#include

using

namespace std;

int ans;

void

solve()

else

}int

main()

lis&lcs:

兩個序列a和b。

輸出序列a的lis和序列ab的lcs的長度。

注意,lis為嚴格遞增的,即a1這是一道動態規劃的經典題目,具體思想就是動態規劃的做法。

lis:複雜度nlogn。對蓄序列進行遍歷,遍歷每個元素的時候對這個元素及其之前的所有元素挨個進行如下判斷

if(a[i]>a[j]) lis[i]=max(lis[i],lis[j]+1);

lcs:複雜度mn。其實這道題我們可以用遞迴的方法,但是遞迴的方法就像斐波那契亞數列,存在太多重複項,我們可能多次求某乙個函式,犧牲了空間換取時間。這道題我們用記憶化的做法,也即是遞推的做法做。我覺得之所以可以這麼做是因為,後面的用得到前面的,前面的用不到後面的,也就是每一步得到的都是最優的。

if

(a[i]

==b[j]

) lcs[i+1]

[j+1

]=lcs[i]

[j]+1;

else

lcs[i+1]

[j+1]=

max(lcs[i]

[j+1

],lcs[i+1]

[j])

;

假設兩個序列ab分別為:

a:0 5 6 4 2 7 8

b:2 3 4 5 6 8

令lcs[ i ]為到從開始一直到 i 位置的最長子序列長度

假設我們當前位於lcs[ 7 ][ 6 ],即a中的8和b中的8,這倆相等,所以它的長度就是lcs[ 7 ][ 6 ]=lcs[ 6 ][ 5 ]+1,若將b中的8換成9即

b:2 3 4 5 6 9

則lcs[ 7 ][ 6 ]=max( lcs[ 7 ][ 5 ],lcs[6][6])

遞迴會有重複,所以用遞推即可求得最優解。

#include

using

namespace std;

#define maxn 5005

int n,m;

long

long

int a[maxn]

,b[maxn]

;long

long

int lis[maxn]

;long

long

int lcs[maxn]

[maxn]

;int

main()

memset

(lcs,0,

sizeof

(lcs));

for(

int i=

0;i)else}}

long

long

int ans2=lcs[n]

[m];

cout<" "

}

拿數問題ii:

給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。

這一題,我們用乙個陣列cnt存一下每個次出現的頻率,然後就可以用和課上的做法類似的做法,利用遞推的方式,和上一題類似。以ans[i]表示到i為止可以拿的最大的分數。 i拿了 i-2就可以拿了,所以是ans[i]=max(ans[i-1],cnt[i]*i+ans[i-2]);

#include

#include

using

namespace std;

#define maxn 100005

long

long

int a[maxn]

;long

long

int cnt[maxn]

;long

long

int ans[maxn]

;int

main()

re=ans[maxnum]

;cout

}

實驗:

簽到題:

東東有乙個字串x,該串包含偶數個字元,一半是 s 字元,一半是 t 字元

東東可以對該字串執行 1010000 次操作:如果存在 st 是該串的子串,則刪除掉最左邊的 st。

即 tsttss⇒ttss、sssttt⇒sstt⇒st⇒空

這道題就是用棧解決,依次將元素壓棧,如果棧頂是s,下乙個是t就pop,否則就push即可。

#include

using

namespace std;

stack<

char

>q;

string s;

intmain()

else

}cout

}

東東轉魔方:

原題鏈結

一道模擬題,這次是模擬乙個222的魔方,看看能不能轉90度使他六面相同。

模擬題做了很多次了,但是還是容易出問題,主要是思路出問題,很早之前之前的撲克牌和這次的魔方都是思路出了問題,我想的是判斷條件是否滿足,而不是去模擬乙個魔方模擬乙個牌,問題就出在這,進行條件的判斷很容易漏條件,或是條件寫錯而且表示式很長,而模擬魔方只需要判斷最終條件是否滿足即可簡單得多。牢記!

#include

using

namespace std;

int t,f,a[25]

,b[25

],x[25]

;intok(

) i=i+4;

}return1;

}int

okk(

) i=i+4;

}return1;

return1;

}voidz1(

)voidz2(

)voidz3(

)int

ok1(

)int

ok2(

)int

ok3(

)int

main()

return

0;

益智題 (簡單的兩道題)

a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...

兩道題題引發的思考

下週的討論課又到我講 了,這幾天都在看 準備ppt,選了一篇好難的 啊,看了這麼久了,還是不夠清晰。所以決定先換下思路,做點題。下面的 輸出是什麼 void add int p add p int main 分析這個題目看起來還是比較友好的。首先我們來分析一下add 函式。其實看名字就能知道它是在做...

兩道FFT的應用題

計算 c k k ia i b i k 正好看到 具體數學 上處理和式的tricks,雖然熱身題也不會做,但碾oi題還是很穩的 orz神犇高教授 對於 k ia i b i k 將b陣列倒置,即b i b n 1 i 原式變為 c k 0 i0 n k 1 ia i b n k 1 i 化簡得到c ...