這是壹個OJ問題吧~~
首先,咱要說的是OJ問題基本上不是編程題,而是數學題或者短碼編程題~
這個問題其實是個數學題,可以發現當羊數量a從檢查站數量1-30遞增過程中,是有規律的,關系為:
a(n) = (a(n-1) - 1) * 2.
求其通項公式為:
a(n) = 2^(n-1) * a(1) - 2^(n-1) + 2.
其中a(1) = 3,則a(n) = 2^n + 2.
所以計算時不需要用循環,比如輸入2的時候,則羊的數量即為2^2 + 2 = 6。
而計算2^n不需要用pow函數,直接用位操作<<即可。
所以程序就很容易出來啦~
#include <stdio.h>
int main()
{
long n;
scanf("%ld", &n);
if(n > 0 && n <= 30)
{
n = (1 << n) + 2;
printf("%ld", n);
}
return 0;
}
要註意其中代表羊數量的那個值n,因為至少要大於2^30 + 2,所以類型必須為long,long的範圍上限是2^31 - 1。
但是這不是最省資源和時間的算法。我們來改造這個程序,首先這裏我們申請了壹個變量n,這個n用來輸入和輸出,這是壹個資源,我們把它去掉。
main函數隱藏的兩個參數正好拿來用,並且if判斷語句可以被三元運算符代替,且在某些編譯器下效率更高,至少是壹樣的。
另外關於include,其實直接去掉即可,不用寫,我們這裏只用到了scanf和printf,大多數編譯器直接認定自己的標準輸入輸出,為了優化代碼,所以即使不用stdio,仍然可以被識別。
所以程序變成了這樣~
int main(int argc, char** argv)
{
scanf("%d", &argc);
((30 - argc) >= 0)?printf("%ld", (long)(1 << argc) + 2):0;
}
OK,這可能不是最簡單的方法,不過應該足以應付了~
PS,執行更加迅速的方法是hack,如果不考慮源碼的長度,那麽可以這麽做,因為a的範圍已經限制在了1到30內,那麽用手算出a是1到30的所有結果,然後初始化壹個29個元素的答案數組,使用switch判斷a的值,直接輸出答案。
PS2,更加快的是不管他輸入什麽,妳都輸出妳推測的答案,然後不停的去試,人品爆發,剛好那次測試通過,這個解剛好是他輸入的值的解,這時候程序運行是出奇的快。這是最惡心的hack,像POJ裏面很多題目只有壹個解,基本上大家都是不管三七二十壹,先用手算出來,直接輸出答案的。。。
PS3,如果樓主懂匯編,可以直接在.c文件中寫匯編代碼,直接輸出1內存左移輸入值+2的值即可。雖然不知道為什麽這麽設計,但是C文件中可以內嵌壹定的匯編代碼,並且可以被編譯。
PS4,做OJ題就不能走常規路哦~
請追問~