在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的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...