又是乙個考試的分析

2021-10-04 23:08:14 字數 3477 閱讀 9288

在4月11日,我又參加了一場比賽(考試)。接下來,我們就來分析一下這次考試的題目。

題目大意:

有乙個字串,其中有n(1<=n<=100)個單詞,每個單詞最大15個字元。讀入之後需要排版成每行只能放k(1<=k<=80)個字元(不包括空格),在每行結尾不能有空格,按照格式輸出。

演算法分析:

這道題十分簡單,就是純粹的處理,沒有任何的其他因素,像時間空間等。所以,我們只需要將這串字元輸入,再列舉每行進行輸出即可。

在題目中說,有n個單詞,這就很容易讓人想到string型別的陣列。string型別本身就是字串,陣列就是有n個字串,所以用string型別是非常的方便的。

由於題目中並沒有說明是否所有單詞長度都小於等於k,所以我們預設他都是合法的。

演算法過程:

首先輸出第乙個字串a[1]。將第乙個字串的長度儲存在乙個size的整數型變數裡,之後列舉i=2…n;在列舉過程中,判斷size+a[i].size()(a[i].size取長度)是否小於等於k。如果小於等於k,說明這一行可以放得下,輸出,累加size。如果大於等於k,說明這一行放不下了,輸出回車和這個字串,將size賦值為a[i].size()。

於是,這道題就簡單的通過了。

題目大意:

有乙個數字串,從樣例分析:

輸入:5

4 6 7 6

輸出:3 1 5 2 4

從樣例解釋中可以看出,4=3+1,6=1+5,7=5+2,6=2+4,也就是說,輸入的數字串中每乙個數字等於輸出的數字串同等位置與同等位置+1的數字相加的和。要求的是所有可能的輸出子串中字典序最小的數字串。這道題,可以從樣例分析中找出題目大意。

演算法分析:

這道題,我看懂題目大意後,我緊緊抱著乙個理念——只要在輸出數字串中列舉到第乙個數字,其他的數字便能求出來。所以,按照這個理念就可以找出所有符合條件的輸出。在這裡我們就會發現,首個數字代表著5個數字,每乙個首數字固定的情況只有乙個。所以,我們就沒必要去列舉每乙個數了,要是列舉每乙個數,不會時間超限會怎樣呢?

演算法過程:

很簡單,只要設出數字串就可以了。我們設a陣列儲存每次列舉的輸出數字串。b陣列儲存輸入數字串。t陣列儲存某乙個數有沒有用過(就是保證在輸出數字串中沒有相同的數)。

定義完清零,列舉i=1…b[1]-1(為什麼是b[1]-1,原因很簡單,因為第乙個數與第二個數的和不可能超過b[1],而且輸出數字串中數字不為零)。

迴圈內步驟:

(1) 迴圈內重新清零。

(2) 將陣列a的第一位重新賦值,陣列t對應也要賦值

(3) 接著,迴圈j=2…n列舉判斷陣列a的其他數值

(4) 如果剛才的列舉陣列a沒有被break,就是合法,輸出(第乙個找到的字典序最小),然後return 0;

(5) 如果沒有列舉成功,回到(1),i++;

這樣,題2解決。

第三題是個燒腦題,很益智,要多多練習。

題目大意:

有一頭奶牛在參加跑步比賽(離譜),在每分鐘她可以增加或減少自己的速度1,也可以不加也不減,此秒內跑步的速度為變化後的速度。這次比賽需要跑k公尺(1<=k<=109)(離譜)。在比賽的最後,衝過終點線時,她希望速度不超過x m/s(1<=x<=105)(離譜)。最後,她想要知道對於n(1<=n<=1000)(離譜)個k對應的結果。其中的速度變化啊,什麼的都在提示裡了:

當 x=1 時,一種最優方案為:

將速度增加到 1 公尺/秒,跑 1 公尺

將速度增加到 2 公尺/秒,跑 2 公尺,總計跑 3 公尺

將速度保持在 2 公尺/秒,總計跑 5 公尺

將速度保持在 2 公尺/秒,總計跑 7 公尺

將速度保持在 2 公尺/秒,總計跑 9 公尺

將速度降低到 1 公尺/秒,總計跑 10 公尺

當 x=3 時,一種最優方案為:

將速度增加到 1 公尺/秒,跑 1 公尺

將速度增加到 2 公尺/秒,總計跑 3 公尺

將速度增加到 3 公尺/秒,總計跑 6 公尺

將速度保持在 3 公尺/秒,總計跑 9 公尺

將速度保持在 3 公尺/秒,總計跑 12 公尺

注意當 x=3 時,以下方案是不合法的:

將速度增加到 1 公尺/秒,跑 1 公尺

將速度增加到 2 公尺/秒,總計跑 3 公尺

將速度增加到 3 公尺/秒,總計跑 6 公尺

將速度增加到 4 公尺/秒,總計跑 10 公尺

這是因為在 bessie 跑完 10 公尺的時刻,她的速度是 4 公尺/秒。

演算法分析:

這道題看起來就很煩。非常煩。這道題出的非常離譜,且不說不可能存在於現實生活,資料量就大的驚人。k<=109。逗我嗎?n<=1000,逗我嗎?「離譜」的題目就需要「離譜」的方法,且不說,我來講一講我是怎樣想的。

首先,我想到了動態規劃,設在某距離某速度的最小時間。突然,我發現,k<=10^9於是我馬上否定了這個方法。

於是我就想,會不會有巧妙的方法,就像上次趣味邀請賽的第一題一樣,有巧算的方法與思路。我就發現,這將會是乙個非常極端的問題。首先要到達頂端,走一些路,再下坡,到達x的時候剛好到達終點。

我自己的方法列舉是可以騙到幾十分的,利用向上與向下的列舉可以時間超限幾十分。最後,在老師的詳細講解下,我聽到了一種最方便快捷的方法。

首先,這個坡可能有幾種形狀:

於是,演算法很容易就出來了

演算法過程:

今天的程式分析完成,下面是他們對應的**:

word:

#include

#include

#include

using

namespace std;

int n,k;

string a[

101]

;int

main()

else

}return0;

}

photo:

#include

#include

using

namespace std;

intmain()

if(j>n)

}return0;

}

race:

#include

#include

using

namespace std;

int x[

1001];

intmain()

for(

int i=

1;i<=n;i++

) cin>>x[i]

;long

long s=0;

for(

int now=

1;now<=n;now++)}

if(s>=k)

continue

; s+

=x[now]

; mtime++

;for

(i=x[now]+1

;1;i++)if

(s+i*

2>k)

s+=i*2

; mtime+=2

;}}return0;

}

又是乙個APIHOOK

又是乙個apihook 借用了海風月影的hookapi 0.5的一些思路 hookproc的函式型別和原來的api一樣,只是引數比原api多2個 dword winapi hookproc dword retaddr pfn x pfn x,引數比原始的api多2個引數 retaddr 呼叫api的...

又是乙個51

記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...

又是乙個51

記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...