給定九個(gè)數(shù),例如:1,3,3,5,6,7,8,8,9計(jì)算出這九個(gè)數(shù)的排列的種數(shù)。需要考慮重復(fù)情況,如果給定9個(gè)1,則只有一種結(jié)果。
限制:不能使用stl庫(kù)
要求:完成函數(shù) unsigned int foo(unsigned int *arr);
輸入算法代碼,并給出算法復(fù)雜度分析。
分析:
#include <cstdlib>
#include <iostream>
using namespace std;
unsigned int foo(unsigned int *arr)
{
unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};
unsigned int i,j,c,s=p[8];//first the number is p99
for(i = 0; i < 7; i++)
for(j = i+1; j < 8; j++)
{
if(arr[i]>arr[j]) //swap two number
{
arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];
}
}
i = 0;
c = 0;
while(i<8)
{
j = i+1;
while(arr[i]==arr[j])//compute the number of the repetition
{
c++;
j++;
}
s/=p[c];
c=0;
i=j;
}
return s;
}
int main()
{
unsigned int a[]={1,3,3,5,6,7,8,8,9};
cout<<"The number of permutation is: "<<foo(a)<<endl;
system("pause");
return 0;
}
還可以改進(jìn)排序那部分。
轉(zhuǎn)一個(gè)經(jīng)典的題目:
給一個(gè)天平,問(wèn)如何用3次把這個(gè)小球找出來(lái)
并且求出這個(gè)小球是比其他的輕還是重
將12個(gè)球分別編號(hào)為a1,a2,a3.......a10,a11,a12.
第一步:將12球分開(kāi)3撥,每撥4個(gè),a1~a4第一撥,記為b1, a5~a8第2撥,記為b2,其余第3撥,記為b3;
第二步:將b1和b2放到天平兩盤上,記左盤為c1,右為c2;這時(shí)候分兩中情況:
1.c1和c2平衡,此時(shí)可以確定從a1到a8都是常球;然后把c2拿空,并從c1上拿下a4,從a9到a12四球里隨便取三球,假設(shè)為a9到a11,放到c2上。此時(shí)c1上是a1到a3,c2上是a9到a11。從這里又分三種情況:
A:天平平衡,很簡(jiǎn)單,說(shuō)明沒(méi)有放上去的a12就是異球,而到此步一共稱了兩次,所以將a12隨便跟11個(gè)常球再稱一次,也就是第三次,馬上就可以確定a12是重還是輕;
B:若c1上升,則這次稱說(shuō)明異球?yàn)閍9到a11三球中的一個(gè),而且是比常球重。取下c1所有的球,并將a8放到c1上,將a9取下,比較a8和a11(第三次稱),如果平衡則說(shuō)明從c2上取下的a9是偏重異球,如果不平衡,則偏向哪盤則哪盤里放的就是偏重異球;
C:若c1下降,說(shuō)明a9到a11里有一個(gè)是偏輕異球。次種情況和B類似,所以接下來(lái)的步驟照搬B就是;
2.c1和c2不平衡,這時(shí)候又分兩種情況,c1上升和c1下降,但是不管哪種情況都能說(shuō)明a9到a12是常球。這步是解題的關(guān)鍵。也是這個(gè)題最妙的地方。
A:c1上升,此時(shí)不能判斷異球在哪盤也不能判斷是輕還是重。取下c1中的a2到a4三球放一邊,將c2中的a5和a6放到c1上,然后將常球a9放到c2上。至此,c1上是a1,a5和a6,c2上是a7,a8和a9。此時(shí)又分三中情況:
1)如果平衡,說(shuō)明天平上所有的球都是常球,異球在從c1上取下a2到a4中。而且可以斷定異球輕重。因?yàn)閍5到a8都是常球,而第2次稱的時(shí)候c1是上升的,所以a2到a4里必然有一個(gè)輕球。那么第三次稱就用來(lái)從a2到a4中找到輕球。這很簡(jiǎn)單,隨便拿兩球放到c1和c2,平衡則剩余的為要找球,不平衡則哪邊低則哪個(gè)為要找球;
2)c1仍然保持上升,則說(shuō)明要么a1是要找的輕球,要么a7和a8兩球中有一個(gè)是重球(這步懂吧?好好想想,很簡(jiǎn)單的。因?yàn)閍9是常球,而取下的a2到a4肯定也是常球,還可以推出換盤放置的a5和a6也是常球。所以要么a1輕,要么a7或a8重)。至此,還剩一次稱的機(jī)會(huì)。只需把a(bǔ)7和a8放上兩盤,平衡則說(shuō)明a1是要找的偏輕異球,如果不平衡,則哪邊高說(shuō)明哪個(gè)是偏重異球;
3)如果換球稱第2次后天平平衡打破,并且c1降低了,這說(shuō)明異球肯定在換過(guò)來(lái)的a5和a6兩求中,并且異球偏重,否則天平要么平衡要么保持c1上升。確定要找球是偏重之后,將a5和a6放到兩盤上稱第3次根據(jù)哪邊高可以判定a5和a6哪個(gè)是重球;
B:第1次稱后c1是下降的,此時(shí)可以將c1看成c2,其實(shí)以后的步驟都同A,所以就不必要再重復(fù)敘述了。至此,不管情況如何,用且只用三次就能稱出12個(gè)外觀手感一模一樣的小球中有質(zhì)量不同于其他11球的偏常的球。而且在稱的過(guò)程中可以判定其是偏輕還是偏重。
3.U2 合唱團(tuán)在17 分鐘內(nèi)得趕到演唱會(huì)場(chǎng),途中必需跨過(guò)一座橋,四個(gè)人從橋的同一端出發(fā),你得幫助他們到達(dá)另一端,天色很暗,而他們只有一只手電筒。一次同時(shí)最多可以有兩人一起過(guò)橋,而過(guò)橋的時(shí)候必須持有手電筒,所以就得有人把手電筒帶來(lái)帶去,來(lái)回橋兩端。手電筒是不能用丟的方式來(lái)傳遞的。四個(gè)人的步行速度各不同,若兩人同行則以較慢者的速度為準(zhǔn)。Bono 需花1 分鐘過(guò)橋,Edge 需花2 分鐘過(guò)橋,Adam需花 5 分鐘過(guò)橋,Larry 需花10 分鐘過(guò)橋。他們要如何在17 分鐘內(nèi)過(guò)橋呢?(有個(gè)同濟(jì)的學(xué)生寫文章說(shuō)他當(dāng)時(shí)在微軟面試時(shí)就是碰到了這道題,最短只能做出在19分鐘內(nèi)過(guò)橋,微軟的人對(duì)他講這樣的結(jié)果已經(jīng)是不錯(cuò)的了!)
A點(diǎn)到 B 點(diǎn)
1 和2 過(guò)去 2 分鐘 2
2 過(guò)來(lái) 4 分鐘 2+2=4
10和 5過(guò)去 14 分鐘 4+10=14
1 過(guò)來(lái) 15 分鐘 14+1=15
1 和2 過(guò)去 17 分鐘 15+2=17
第一組
1.燒一根不均勻的繩,從頭燒到尾總共需要1個(gè)小時(shí)。現(xiàn)在有若干條材質(zhì)相同的繩子,問(wèn)如何用燒繩的方法來(lái)計(jì)時(shí)一個(gè)小時(shí)十五分鐘呢?
ans:三根繩,開(kāi)始的時(shí)候,第一根點(diǎn)燃兩端,第二根點(diǎn)燃一端,第三根不點(diǎn)。第一根繩燒完(30分鐘)后,點(diǎn)燃第二根繩的另一端,第二根只要15分鐘就可以燒完了,第二根繩燒完(45分鐘)后,點(diǎn)燃第三根繩子兩端,第三根繩燒完(1小時(shí)15分)后,計(jì)時(shí)完成
2.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個(gè)。抓取多少個(gè)就可以確定你肯定有兩個(gè)同一顏色的果凍?
3.如果你有無(wú)窮多的水,一個(gè)3公升的提捅,一個(gè)5公升的提捅,兩只提捅形狀上下都不均勻,問(wèn)你如何才能準(zhǔn)確稱出4公升的水?
4.一個(gè)岔路口分別通向誠(chéng)實(shí)國(guó)和說(shuō)謊國(guó)。來(lái)了兩個(gè)人,已知一個(gè)是誠(chéng)實(shí)國(guó)的,另一個(gè)是說(shuō)謊國(guó)的。誠(chéng)實(shí)國(guó)永遠(yuǎn)說(shuō)實(shí)話,說(shuō)謊國(guó)永遠(yuǎn)說(shuō)謊話。現(xiàn)在你要去說(shuō)謊國(guó),但不知道應(yīng)該走哪條路,需要問(wèn)這兩個(gè)人。請(qǐng)問(wèn)應(yīng)該怎么問(wèn)?
5.12個(gè)球一個(gè)天平,現(xiàn)知道只有一個(gè)和其它的重量不同,問(wèn)怎樣稱才能用三次就找到那個(gè)球。13個(gè)呢?(注意此題并未說(shuō)明那個(gè)球的重量是輕是重,所以需要仔細(xì)考慮)
6.在9個(gè)點(diǎn)上畫10條直線,要求每條直線上至少有三個(gè)點(diǎn)?
7.在一天的24小時(shí)之中,時(shí)鐘的時(shí)針、分針和秒針完全重合在一起的時(shí)候有幾次?都分別是什么時(shí)間?你怎樣算出來(lái)的?
8.怎么樣種植4棵樹(shù)木,使其中任意兩棵樹(shù)的距離相等?
第二組
1.為什么下水道的蓋子是圓的?
2.中國(guó)有多少輛汽車?
3.將汽車鑰匙插入車門,向哪個(gè)方向旋轉(zhuǎn)就可以打開(kāi)車鎖?
4.如果你要去掉中國(guó)的34個(gè)省(含自治區(qū)、直轄市和港澳特區(qū)及臺(tái)灣省)中的任何一個(gè),你會(huì)去掉哪一個(gè),為什么?
5.多少個(gè)加油站才能滿足中國(guó)的所有汽車?
6.想象你站在鏡子前,請(qǐng)問(wèn),為什么鏡子中的影象可以顛倒左右,卻不能顛倒上下?
7.為什么在任何旅館里,你打開(kāi)熱水,熱水都會(huì)瞬間傾瀉而出?
8.你怎樣將Excel的用法解釋給你的奶奶聽(tīng)?
9.你怎樣重新改進(jìn)和設(shè)計(jì)一個(gè)ATM銀行自動(dòng)取款機(jī)?
10.如果你不得不重新學(xué)習(xí)一種新的計(jì)算機(jī)語(yǔ)言,你打算怎樣著手來(lái)開(kāi)始?
11.如果你的生涯規(guī)劃中打算在5年內(nèi)受到獎(jiǎng)勵(lì),那獲取該項(xiàng)獎(jiǎng)勵(lì)的動(dòng)機(jī)是什么?觀眾是誰(shuí)?
12.如果微軟告訴你,我們打算投資五百萬(wàn)美元來(lái)啟動(dòng)你的投資計(jì)劃,你將開(kāi)始什么樣商業(yè)計(jì)劃?為什么?
13.如果你能夠?qū)⑷澜绲碾娔X廠商集合在一個(gè)辦公室里,然后告訴他們將被強(qiáng)迫做一件事,那件事將是什么?
第三組
1.你讓工人為你工作7天,回報(bào)是一根金條,這個(gè)金條平分成相連的7段,你必須在每天結(jié)束的時(shí)候給他們一段金條。如果只允許你兩次把金條弄斷,你如何給你的工人付費(fèi)?
2.有一輛火車以每小時(shí)15公里的速度離開(kāi)北京直奔廣州,同時(shí)另一輛火車每小時(shí)20公里的速度從廣州開(kāi)往北京。如果有一只鳥(niǎo),以30公里每小時(shí)的速度和兩輛火車同時(shí)啟動(dòng),從北京出發(fā),碰到另一輛車后就向相反的方向返回去飛,就這樣依次在兩輛火車之間來(lái)回地飛,直到兩輛火車相遇。請(qǐng)問(wèn),這只鳥(niǎo)共飛行了多長(zhǎng)的距離?
3.你有四個(gè)裝藥丸的罐子,每個(gè)藥丸都有一定的重量,被污染的藥丸是沒(méi)被污染的藥丸的重量+1。只稱量一次,如何判斷哪個(gè)罐子的藥被污染了?
4.門外三個(gè)開(kāi)關(guān)分別對(duì)應(yīng)室內(nèi)三盞燈,線路良好,在門外控制開(kāi)關(guān)時(shí)候不能看到室內(nèi)燈的情況,現(xiàn)在只允許進(jìn)門一次,確定開(kāi)關(guān)和燈的對(duì)應(yīng)關(guān)系?
5.人民幣為什么只有1、2、5、10的面值?
6.你有兩個(gè)罐子以及50個(gè)紅色彈球和50個(gè)藍(lán)色彈球,隨機(jī)選出一個(gè)罐子, 隨機(jī)選出一個(gè)彈球放入罐子,怎么給出紅色彈球最大的選中機(jī)會(huì)?在你的計(jì)劃里,得到紅球的幾率是多少?
7.給你兩顆6面色子,可以在它們各個(gè)面上刻上0-9任意一個(gè)數(shù)字,要求能夠用它們拼出任意一年中的日期數(shù)值
第四組
第一題 . 五個(gè)海盜搶到了100顆寶石,每一顆都一樣大小和價(jià)值連城。他們決定這么分:
抽簽決定自己的號(hào)碼(1、2、3、4、5)
首先,由1號(hào)提出分配方案,然后大家表決,當(dāng)且僅當(dāng)超過(guò)半數(shù)的人同意時(shí),按照他的方案
進(jìn)行分配,否則將被扔進(jìn)大海喂鯊魚(yú)
如果1號(hào)死后,再由2號(hào)提出分配方案,然后剩下的4人進(jìn)行表決,當(dāng)且僅當(dāng)超過(guò)半數(shù)的人同
意時(shí),按照他的方案進(jìn)行分配,否則將被扔入大海喂鯊魚(yú)
依此類推
條件:每個(gè)海盜都是很聰明的人,都能很理智地做出判斷,從而做出選擇。
問(wèn)題:第一個(gè)海盜提出怎樣的分配方案才能使自己的收益最大化?
第二題 . 一道關(guān)于飛機(jī)加油的問(wèn)題,已知:
每個(gè)飛機(jī)只有一個(gè)油箱,
飛機(jī)之間可以相互加油(注意是相互,沒(méi)有加油機(jī))
一箱油可供一架飛機(jī)繞地球飛半圈,
問(wèn)題:
為使至少一架飛機(jī)繞地球一圈回到起飛時(shí)的飛機(jī)場(chǎng),至少需要出動(dòng)幾架飛機(jī)?(所有飛機(jī)從同一機(jī)場(chǎng)起飛,而且必須安全返回機(jī)場(chǎng),不允許中途降落,中間沒(méi)有飛機(jī)場(chǎng))第三題. 汽車加油問(wèn)題
一輛載油500升的汽車從A開(kāi)往1000公里外的B,已知汽車每公里耗油量為1升,A處有無(wú)窮多的油,其他任何地點(diǎn)都沒(méi)有油,但該車可以在任何地點(diǎn)存放油以備中轉(zhuǎn),問(wèn)從A到B最少需要多少油
第四題. 擲杯問(wèn)題
一種杯子,若在第N層被摔破,則在任何比N高的樓層均會(huì)破,若在第M層不破,則在任何比M低的樓層均會(huì)破,給你兩個(gè)這樣的杯子,讓你在100層高的樓層中測(cè)試,要求用最少的測(cè)試次數(shù)找出恰巧會(huì)使杯子破碎的樓層。
第五題. 推理游戲
教授選出兩個(gè)從2到9的數(shù),把它們的和告訴學(xué)生甲,把它們的積告訴學(xué)生乙,讓他們輪流猜這兩個(gè)數(shù)
甲說(shuō):“我猜不出”
乙說(shuō):“我猜不出”
甲說(shuō):“我猜到了”
乙說(shuō):“我也猜到了”
問(wèn)這兩個(gè)數(shù)是多少
第六題. 病狗問(wèn)題
一個(gè)住宅區(qū)內(nèi)有100戶人家,每戶人家養(yǎng)一條狗,每天傍晚大家都在同一個(gè)地方遛狗。已知這些狗中有一部分病狗,由于某種原因,狗的主人無(wú)法判斷自己的狗是否是病狗,卻能夠分辨其他的狗是否有病,現(xiàn)在,上級(jí)傳來(lái)通知,要求住戶處決這些病狗,并且不允許指認(rèn)他人的狗是病狗(就是只能判斷自己的),過(guò)了7天之后,所有的病狗都被處決了,問(wèn),一共有幾只病狗?為什么?
第八題. 監(jiān)獄里有100個(gè)房間,每個(gè)房間內(nèi)有一囚犯。一天,監(jiān)獄長(zhǎng)說(shuō),你們獄房外有一電燈,你們?cè)诜棚L(fēng)時(shí)可以控制這個(gè)電燈(熄或亮)。每天只能有一個(gè)人出來(lái)放風(fēng),并且防風(fēng)是隨機(jī)的。如果在有限時(shí)間內(nèi),你們中的某人能對(duì)我說(shuō):“我敢保證,現(xiàn)在每個(gè)人都已經(jīng)至少放過(guò)一次風(fēng)了。”我就放了你們!問(wèn)囚犯?jìng)円扇∈裁床呗圆拍鼙槐O(jiān)獄長(zhǎng)放掉?如果采用了這種策略,大致多久他們可以被釋放?
第五組
1.某手機(jī)廠家由于設(shè)計(jì)失誤,有可能造成電池壽命比原來(lái)設(shè)計(jì)的壽命短一半(不是沖放電時(shí)間),解決方案就是免費(fèi)更換電池或給50元購(gòu)買該廠家新手機(jī)的折換券。請(qǐng)給所有已購(gòu)買的用戶寫信告訴解決方案。
2.一高層領(lǐng)導(dǎo)在參觀某博物館時(shí),向博物館館員小王要了一塊明代的城磚作為紀(jì)念,按國(guó)家規(guī)定,任何人不得將博物館收藏品變?yōu)樗接小2┪镳^館長(zhǎng)需要如何寫信給這位領(lǐng)導(dǎo),將城磚取回。
3.營(yíng)業(yè)員小姐由于工作失誤,將2萬(wàn)元的筆記本電腦以1.2萬(wàn)元錯(cuò)賣給李先生,王小姐的經(jīng)理怎么寫信給李先生試圖將錢要回來(lái)?
4.給你一款新研制的手機(jī),如果你是測(cè)試組的組長(zhǎng),你會(huì)如何測(cè)試?
5.如何為函數(shù)int atoi(const char * pstr)編寫測(cè)試向量?
第六組
1.鏈表和數(shù)組的區(qū)別在哪里?
2.編寫實(shí)現(xiàn)鏈表排序的一種算法。說(shuō)明為什么你會(huì)選擇用這樣的方法?
3.編寫實(shí)現(xiàn)數(shù)組排序的一種算法。說(shuō)明為什么你會(huì)選擇用這樣的方法?
4.請(qǐng)編寫能直接實(shí)現(xiàn)char * strcpy(char * pstrDest,const char * pstrSource)函數(shù)功能的代碼。
5.編寫反轉(zhuǎn)字符串的程序,要求優(yōu)化速度、優(yōu)化空間。
6.在鏈表里如何發(fā)現(xiàn)循環(huán)鏈接?
7.給出洗牌的一個(gè)算法,并將洗好的牌存儲(chǔ)在一個(gè)整形數(shù)組里。
8.寫一個(gè)函數(shù),檢查字符是否是整數(shù),如果是,返回其整數(shù)值。(或者:怎樣只用4行代碼
9.給出一個(gè)函數(shù)來(lái)輸出一個(gè)字符串的所有排列。
10.請(qǐng)編寫實(shí)現(xiàn)void * malloc(int)內(nèi)存分配函數(shù)功能一樣的代碼。
11.給出一個(gè)函數(shù)來(lái)復(fù)制兩個(gè)字符串A和B。字符串A的后幾個(gè)字節(jié)和字符串B的前幾個(gè)字節(jié)重疊。
12.怎樣編寫一個(gè)程序,把一個(gè)有序整數(shù)數(shù)組放到二叉樹(shù)中?
13.怎樣從頂部開(kāi)始逐層打印二叉樹(shù)結(jié)點(diǎn)數(shù)據(jù)?請(qǐng)編程。
14.怎樣把一個(gè)鏈表掉個(gè)順序(也就是反序,注意鏈表的邊界條件并考慮空鏈表)? --
15.請(qǐng)編寫能直接實(shí)現(xiàn)int atoi(const char * pstr)函數(shù)功能的代碼
-----------------------------------------------------------------------------------
第一組題答案:
2)根據(jù)抽屜原理,4個(gè)
3)3升裝滿;3升-〉5升(全注入);3升裝滿;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升裝滿;3升-〉5升;完成(另:可用回溯法編程求解)
4)問(wèn)其中一人:另外一個(gè)人會(huì)說(shuō)哪一條路是通往誠(chéng)實(shí)國(guó)的?回答者所指的那條路必然是通往說(shuō)謊國(guó)的。
5)12個(gè)球:
第一次:4,4 如果平了:
那么剩下的球中取3放左邊,取3個(gè)好球放右邊,稱:
如果左邊重,那么取兩個(gè)球稱一下,哪個(gè)重哪個(gè)是次品,平的話第三個(gè)重,是次品,輕的話同理
如果平了,那么剩下一個(gè)次品,還可根據(jù)需要稱出次品比正品輕或者重
如果不平:
那么不妨設(shè)左邊重右邊輕,為了便于說(shuō)明,將左邊4顆稱為重球,右邊4顆稱為輕球,剩下4顆稱為好球
取重球2顆,輕球2顆放在左側(cè),右側(cè)放3顆好球和一顆輕球
如果左邊重
稱那兩顆重球,重的一個(gè)次品,平的話右邊輕球次品
如果右邊重
稱左邊兩顆輕球,輕的一個(gè)次品
如果平
稱剩下兩顆重球,重的一個(gè)次品,平的話剩下那顆輕球次品
13個(gè)球:
第一次:4,4,如果平了
剩5顆球用上面的方法仍舊能找出次品,只是不能知道次品是重是輕
如果不平,同上
6)
o o o
o o o
o o o
7)
23次,因?yàn)榉轴樢D(zhuǎn)24圈,時(shí)針才能轉(zhuǎn)1圈,而分針和時(shí)針重合兩次之間的間隔顯然>1小時(shí),它們有23次重合機(jī)會(huì),每次重合中秒針有一次重合機(jī)會(huì),所以是23次
重合時(shí)間可以對(duì)照手表求出,也可列方程求出
8)
在地球表面種樹(shù),做一個(gè)地球內(nèi)接的正四面體,內(nèi)接點(diǎn)即為所求
第二組 無(wú)標(biāo)準(zhǔn)答案
第三組
1. 分成1,2,4三段,第一天給1,第二天給2取回1,第3天給1,第4天給4取回1、2,第5天給1,第6天給2取回1,第七天給1
2. 求出火車相遇時(shí)間,鳥(niǎo)速乘以時(shí)間就是鳥(niǎo)飛行的距離
3. 四個(gè)罐子中分別取1,2,3,4顆藥丸,稱出比正常重多少,即可判斷出那個(gè)罐子的藥被污染
4. 三個(gè)開(kāi)關(guān)分別:關(guān),開(kāi),開(kāi)10分鐘,然后進(jìn)屋,暗且涼的為開(kāi)關(guān)1控制的燈,亮的為開(kāi)關(guān)2控制的燈,暗且熱的為開(kāi)關(guān)3控制的燈
5. 因?yàn)榭梢杂?,2,5,10組合成任何需要的貨幣值,日常習(xí)慣為10進(jìn)制
6. 題意不理解...*_*
7. 012345 0126(9)78
第四組 都是很難的題目
第一題:97 0 1 2 0 或者 97 0 1 0 2 (提示:可用逆推法求出)
第二題:3架飛機(jī)5架次,飛法:
ABC 3架同時(shí)起飛,1/8處,C給AB加滿油,C返航,1/4處,B給A加滿油,B返航,A到達(dá)1/2處,C從機(jī)場(chǎng)往另一方向起飛,3/4處,C同已經(jīng)空油箱的A平分剩余油量,同時(shí)B從機(jī)場(chǎng)起飛,AC到7/8處同B平分剩余油量,剛好3架飛機(jī)同時(shí)返航。所以是3架飛機(jī)5架次。第三題:需要建立數(shù)學(xué)模型
(提示,嚴(yán)格證明該模型最優(yōu)比較麻煩,但確實(shí)可證,大膽猜想是解題關(guān)鍵)
題目可歸結(jié)為求數(shù)列 an=500/(2n+1) n=0,1,2,3......的和Sn什么時(shí)候大于等于1000,解得n>6
當(dāng)n=6時(shí),S6=977.57
所以第一個(gè)中轉(zhuǎn)點(diǎn)離起始位置距離為1000-977.57=22.43公里
所以第一次中轉(zhuǎn)之前共耗油 22.43*(2*7+1)=336.50升
此后每次中轉(zhuǎn)耗油500升
所以總耗油量為7*500+336.50=3836.50升
第四題:需要建立數(shù)學(xué)模型
題目可歸結(jié)為求自然數(shù)列的和S什么時(shí)候大于等于100,解得n>13
第一個(gè)杯子可能的投擲樓層分別為:14,27,39,50,60,69,77,84,90,95,99,100
第五題:3和4(可嚴(yán)格證明)
設(shè)兩個(gè)數(shù)為n1,n2,n1>=n2,甲聽(tīng)到的數(shù)為n=n1+n2,乙聽(tīng)到的數(shù)為m=n1*n2
證明n1=3,n2=4是唯一解
證明:要證以上命題為真,不妨先證n=7
1)必要性:
i) n>5 是顯然的,因?yàn)閚<4不可能,n=4或者n=5甲都不可能回答不知道
ii) n>6 因?yàn)槿绻鹡=6的話,那么甲雖然不知道(不確定2+4還是3+3)但是無(wú)論是2,4還是3,3乙都不可能說(shuō)不知道(m=8或者m=9的話乙說(shuō)不知道是沒(méi)有道理的)
iii) n<8 因?yàn)槿绻鹡>=8的話,就可以將n分解成 n=4+x 和 n=6+(x-2),那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要條件是x=6即n=10,那樣n又可以分解成8+2,所以總之當(dāng)n>=8時(shí),n至少可以分解成兩種不同的合數(shù)之和,這樣乙說(shuō)不知道的時(shí)候,甲就沒(méi)有理由馬上說(shuō)知道。
以上證明了必要性
2)充分性
當(dāng)n=7時(shí),n可以分解成2+5或3+4
顯然2+5不符合題意,舍去,容易判斷出3+4符合題意,m=12,證畢
于是得到n=7 m=12 n1=3 n2=4是唯一解。第六題:7只(數(shù)學(xué)歸納法證明)
1)若只有1只病狗,因?yàn)椴」分魅丝床坏接衅渌」罚厝粫?huì)知道自己的狗是病狗(前提是一定存在病狗),所以他會(huì)在第一天把病狗處決。
2)設(shè)有k只病狗的話,會(huì)在第k天被處決,那么,如果有k+1只,病狗的主人只會(huì)看到k只病狗,而第k天沒(méi)有人處決病狗,病狗主人就會(huì)在第k+1天知道自己的狗是病狗,于是病狗在第k+1天被處決
3)由1)2)得,若有n只病狗,必然在第n天被處決
第八題:
約定好一個(gè)人作為報(bào)告人(可以是第一個(gè)放風(fēng)的人)
規(guī)則如下:
1、報(bào)告人放風(fēng)的時(shí)候開(kāi)燈并數(shù)開(kāi)燈次數(shù)
2、其他人第一次遇到開(kāi)著燈放風(fēng)時(shí),將燈關(guān)閉
3、當(dāng)報(bào)告人第100次開(kāi)燈的時(shí)候,去向監(jiān)獄長(zhǎng)報(bào)告,要求監(jiān)獄長(zhǎng)放人......
按照概率大約30年后(10000天)他們可以被釋放
第五組無(wú)標(biāo)準(zhǔn)答案
第六組部分題參考答案:
4.
char * strcpy(char * pstrDest,const char * pstrSource)
{
assert((pstrDest!=NULL)&&(pstrSource!=NULL));
char * pstr=pstrDest;
while((*(pstrDest++)=*(pstrSource++))!='\0');
return pstr;
}
5.
char * strrev(char * pstr)
{
assert(pstr!=NULL);
char * p=pstr;
char * pret=pstr;
while(*(p++)!='\0');
p--;
char tmp;
while(p>pstr)
{
tmp=*p;
*(p--)=*(pstr);
*(pstr++)=tmp;
}
return pret;
百度筆試題:
IP段格式:ip1 ip2。之間以空格分開(kāi),ip形式為X.X.X.X,數(shù)據(jù)保存在文件中,文件不超過(guò)2k行,無(wú)序。現(xiàn)在要求編寫算法去掉可重IP,可重有三種形式:包含、交疊、緊靠。
例如,文件內(nèi)容為:
10.0.0.0 10.0.0.12
10.0.0.5 10.0.0.10 ( <= 包含)
10.0.0.8 10.0.0.15 ( <= 交疊)
10.0.0.15 10.0.0.24 ( <= 緊靠)
最后輸出為:
10.0.0.0 10.0.0.24
code:
/*
**這個(gè)函數(shù)的作用是將文件中的一行對(duì)應(yīng)的兩個(gè)數(shù)據(jù)轉(zhuǎn)換成整形的數(shù)據(jù)
**比如把10.0.0.0 10.0.0.12 轉(zhuǎn)換后,left=10*224,就是10.0.0.0對(duì)應(yīng)的整數(shù),每個(gè)數(shù)字對(duì)應(yīng)8位,right=left+12
*/
void ParseLine( char line[], size_t length, unsigned int &left, unsigned int &right)
{
size_t i;
for( i=0; i<length; i++ )
{
if ( line[i]=='.' || line[i]==' ' )//將點(diǎn)變成0
{
line[i]=0;
}
}
char *p = (char*)&left;
char *num = line;
for( i=3; i<4; --i ) //size是size_t,而size_t是unsigned int,所以i=0再自減后變成了最大的整數(shù),循環(huán)就會(huì)終止
{
// cout<<i<<",";
*(p+i) = strtol( num, &num ,10 );
cout<<static_cast<int>(*(p+i))<<",";
++num;
// cout<<num<<":";
}
cout<<endl;
p = (char*)&right;
for( i=3; i<4; --i )
{
*(p+i) = strtol( num, &num, 10 );
++num;
}
}
void UniqueSequence( vector<unsigned int> & uSeq, unsigned int left, unsigned int right )
{
size_t i, lPos=-1, rPos=-1;
for( i=0; i<uSeq.size(); i++ )
{
if( left <= uSeq.at(i) )
{
lPos = i;
break;
}
}
for( ;i<uSeq.size(); i++ )
{
if( right<=uSeq.at(i) )
{
rPos=i;
break;
}
}
if( lPos == -1 )
{
uSeq.push_back( left );
uSeq.push_back( right );
return;
}
if( lPos%2 == 0 )
{
if( uSeq.at(lPos)==left )
{
}
else
{
uSeq.insert( uSeq.begin()+lPos, left );
}
}
else
{
--lPos;
}
if( rPos == -1 )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );
uSeq.push_back(right);
}
else if( rPos%2 == 0 )
{
if( uSeq.at(rPos)== right )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
uSeq.insert( uSeq.begin()+rPos, right );
}
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
}
}
void PrintIP( unsigned int num )
{
char *p = (char*)#
for( size_t i=3;i>0; --i)
{
cout<< (int)p[i]<<".";
}
cout<<(int)p[0];
}
#define MAX_BUFFER_LENGTH 100
int main()
{
unsigned int left, right;
char buffer[MAX_BUFFER_LENGTH];
ifstream infile( "test.txt" );
if( infile.fail() )
{
return 0;
}
vector<unsigned int> uSeq;
while( infile.getline(buffer, MAX_BUFFER_LENGTH) )
{
ParseLine(buffer, strlen(buffer), left, right);
// cout<<left<<","<<right<<endl;
UniqueSequence( uSeq, left, right );
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
cout<<endl;
}
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
return 0;
}
/*long strtol( const char *nptr, char **endptr, int base ),其中nptr是以NULL結(jié)尾字符串,endptr是字符串停止掃描的地方(Pointer to character that stops scan),strtol returns the value represented in the string nptr,The strtol function converts nptr to a long. strtol stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base.
string = "-10110134932This stopped it";
l = strtol( string, &stopstring, 10 );
printf( "string = %s", string );
printf(" strtol = %ld", l );
printf(" Stopped scan at: %s", stopstring );
string = "10110134932";
printf( "string = %s\n", string );
/* Convert string using base 2, 4, and 8: */
for( base = 2; base <= 8; base *= 2 )
{
/* Convert the string: */
ul = strtoul( string, &stopstring, base );
printf( " strtol = %ld (base %d)\n", ul, base );
printf( " Stopped scan at: %s\n", stopstring );
}
打印的結(jié)果是:
string = -10110134932This stopped it strtol = -2147483647 Stopped scan at: This stopped itstring = 10110134932
strtol = 45 (base 2)
Stopped scan at: 34932
strtol = 4423 (base 4)
Stopped scan at: 4932
strtol = 2134108 (base 8)
Stopped scan at: 932
*/
5.如果存在兩個(gè)變量:a和b,不使用“if”、“?:”、 “switch”和其它的判斷語(yǔ)句,找出兩個(gè)數(shù)中的最大值。
答案:( ( a + b ) + abs( a - b ) ) / 2
6. 寫一個(gè)函數(shù)找出一個(gè)整數(shù)數(shù)組中,第二大的數(shù) (microsoft)
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}