日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

8月14小练

發(fā)布時(shí)間:2024/4/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8月14小练 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)址:CSUST-8-14-小練

這次的題目我只出了一道:A,Teilwal出3道:B,C,D,從此不再?出一道:E

表示我出的題目不是很難,但是很容易出錯(cuò)......因?yàn)闇y(cè)試數(shù)據(jù)太簡(jiǎn)單......表示我在這邊錯(cuò)了一次,在HDU提交了4次才過(guò),錯(cuò)了3次啊......T^T,我的正確率啊......QAQ

A 貪心orDP,B,C 博弈,D 數(shù)論 E Dijkstra + 記憶化搜索

A ??Doing Homework again??HDU 1789

大意是,要盡可能的少扣學(xué)分,要在截止日期之前做完,就不會(huì)扣,一個(gè)課程有一個(gè)截止日期以及他的學(xué)分,問(wèn)最少扣的學(xué)分是多少。

代碼: ? ? 46ms

1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 class A 6 { 7 public: 8 int a; 9 int b; 10 }x[1005]; 11 int cmp(A i,A j) 12 { 13 if(i.a==j.a) //按時(shí)間排,時(shí)間一樣,就學(xué)分多的放前面 14 return i.b>j.b; 15 else 16 return i.a<j.a; 17 } 18 int main() 19 { 20 int T,n,min,sum,j,k,i,c[1005]; 21 scanf("%d",&T); 22 while(T--) 23 { 24 sum=0; 25 min=1000000; 26 scanf("%d",&n); 27 for(i=1;i<=n;i++) 28 { 29 scanf("%d",&x[i].a); 30 c[i]=0; 31 } 32 for(i=1;i<=n;i++) 33 scanf("%d",&x[i].b); 34 sort(x+1,x+n+1,cmp); //排序 35 k=0; //選定的個(gè)數(shù) 36 for(i=1;i<=n;i++) 37 { 38 if(x[i].a>k) 39 { 40 c[i]=1; //已被選定,標(biāo)記 41 k++; 42 } 43 else //因?yàn)闀r(shí)間原因,沒(méi)有被選 44 { 45 min=x[i].b; 46 j=i; 47 for(int l=i-1;l>0;l--) 48 if(c[l]==1&&x[l].b<min) //在前面被選定的中找到最小的交換 49 { 50 min=x[l].b; 51 j=l; 52 } 53 sum+=x[j].b; //加上這個(gè)被換下來(lái)的最小的數(shù) 54 x[j].b=x[i].b; //交換 55 } 56 } 57 printf("%d\n",sum); 58 } 59 return 0; 60 }

再來(lái)個(gè)學(xué)姐的代碼: ? ? ? ? ? ? ? ? ? ? ? 31ms

覺(jué)得學(xué)姐的代碼好神奇........QAQ ? ......我腫么就沒(méi)想到呢.....

1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 const int maxn=1000+10; 8 int used[maxn]; 9 struct node 10 { 11 int d; 12 int s; 13 }p[maxn]; 14 bool cmp(node a,node b) 15 { 16 return a.s>b.s||(a.s==b.s&&a.d>b.d); //按學(xué)分排序,學(xué)分相同就時(shí)間大的放前面 17 } 18 int main() 19 { 20 int T,i,j,n,ans; 21 scanf("%d",&T); 22 while(T--) 23 { 24 scanf("%d",&n); 25 for(i=1;i<=n;i++) 26 scanf("%d",&p[i].d); 27 for(i=1;i<=n;i++) 28 scanf("%d",&p[i].s); 29 sort(p+1,p+1+n,cmp); 30 memset(used,0,sizeof(used)); 31 ans=0; 32 for(i=1;i<=n;i++) 33 { 34 for(j=p[i].d;j>0;j--) 35 if(used[j]==0) 36 { 37 used[j]=1; //表示第j天已經(jīng)有作業(yè)了 38 break; 39 } 40 if(j==0) 41 ans+=p[i].s; 42 } 43 printf("%d\n",ans); 44 } 45 return 0; 46 }

B ?Brave Game? ??HDU 1846

一堆n個(gè)石子,每人每次最多取m個(gè),最少取1個(gè),問(wèn)是先手贏還是后手贏~~~~\(≧▽≦)/~

巴什博弈,一個(gè)人拿1~m個(gè),那誰(shuí)面對(duì)m+1的局勢(shì)的的時(shí)候則必?cái)?#xff0c;很明顯,先拿的就是要造這個(gè)局勢(shì),如果n是(m+1)*r+s(k為任意,s<m+1),那么很明顯先拿的拿掉s后,然后無(wú)論下一個(gè)拿多少你都可以保證你拿完后都是拿了m+1個(gè),這樣后拿的必定面對(duì)必?cái)【謩?shì),比如23 2,23=(3×7)+2;那我第一次拿掉2,然后無(wú)論每次第二個(gè)拿幾我都可以使得這輪總共拿3,然后他必定會(huì)面對(duì)3這個(gè)局勢(shì),然后我就必勝,那什么時(shí)候必?cái)∧?#xff0c;很明顯如果我面對(duì)的是(m+1)的倍數(shù)的局勢(shì)就必?cái) ?/p>

所以:代碼: ? ?0ms

1 #include <stdio.h> 2 int main() 3 { 4 int n,m; 5 int T; 6 scanf("%d",&T); 7 while(T--) 8 { 9 scanf("%d%d",&n,&m); 10 if(n%(m+1) == 0) 11 printf("second\n"); 12 else 13 printf("first\n"); 14 } 15 return 0; 16 }

C ?取石子游戲? ??HDU 1527?

詳情解釋.......來(lái)自:http://www.cnblogs.com/jiangjun/archive/2012/10/25/2740194.html

大致上是這樣的:有兩堆石子,不妨先認(rèn)為一堆有10,另一堆有15個(gè),雙方輪流取走一些石子,合法的取法有如下兩種:

1)在一堆石子中取走任意多顆;

2)在兩堆石子中取走相同多的任意顆;

約定取走最后一顆石子的人為贏家,求必?cái)B(tài)(必勝策略)。

這個(gè)可以說(shuō)是MR.Wythoff(Wythoff于1907年提出此游戲)一生全部的貢獻(xiàn)吧,我在一篇日志里就說(shuō)完有點(diǎn)殘酷。這個(gè)問(wèn)題好像被用作編程競(jìng)賽的題目,網(wǎng)上有很多把它Label為POJ1067,不過(guò)如果學(xué)編程的人不知道Beatty定理和Beatty序列 ,他們所做的只能是找規(guī)律而已。不熟悉的人可以先在這里 玩幾局~

簡(jiǎn)單分析一下,容易知道兩堆石頭地位是一樣的,我們用余下的石子數(shù)(a,b)來(lái)表示狀態(tài),并畫在平面直角坐標(biāo)系上。

用之前的定理: 有限個(gè)結(jié)點(diǎn)的無(wú)回路有向圖有唯一的核 ?中所述的方法尋找必?cái)B(tài)。先標(biāo)出(0,0),然后劃去所有(0,k),(k,0),(k,k)的格點(diǎn);然后找y=x上方未被劃去的格點(diǎn),標(biāo)出(1,2),然后劃去(1,k),(k,2),(1+k,2+k),同時(shí)標(biāo)出對(duì)稱點(diǎn)(2,1),劃去(2,k),(1,k),(2+k,1+k);然后在未被劃去的點(diǎn)中在y=x上方再找出(3,5)。。。按照這樣的方法做下去,如果只列出a<=b的必?cái)B(tài)的話,前面的一些是(0,0),(1,2),(3,5),(4,7),(6,10),…

接下來(lái)就是找規(guī)律的過(guò)程了,忽略(0,0),記第n組必?cái)B(tài)為(a[n],b[n])

命題一:a[n+1]=前n組必?cái)B(tài)中未出現(xiàn)過(guò)的最小正整數(shù)

[分析]:如果a[n+1]不是未出現(xiàn)的數(shù)中最小的,那么可以從a[n+1]的狀態(tài)走到一個(gè)使a[n+1]更小的狀態(tài),和我們的尋找方法矛盾。

命題二:b[n]=a[n]+n

[分析]:歸納法:若前k個(gè)必?cái)B(tài)分別為 ,下證:第k+1個(gè)必?cái)B(tài)為

從該第k+1個(gè)必?cái)B(tài)出發(fā),一共可能走向三類狀態(tài),從左邊堆拿走一些,從右邊堆拿走一些,或者從兩堆中拿走一些.下面證明這三類都是勝態(tài).

情況一:由命題一,任意一個(gè)比a[k+1]小的數(shù)都在之前的必?cái)B(tài)中出現(xiàn)過(guò),一旦把左邊堆拿少了,我們只要再拿成那個(gè)數(shù)相應(yīng)的必?cái)B(tài)即可。

情況二(從右邊堆拿走不太多):這使得兩堆之間的差變小了,比如拿成了 ,則可再拿成 ;

情況二(從右邊堆拿走很多):使得右邊一堆比左邊一堆更少,這時(shí)類似于情況一,比如拿成了 (其中a[m] ;

情況三:比如拿成 ,則可再拿成 .

綜上所述,任何從 出發(fā)走向的狀態(tài)都可以走回核中.故原命題成立.

以上兩個(gè)命題對(duì)于確定(a[n],b[n])是完備的了,給定(0,0)然后按照這兩個(gè)命題,就可以寫出(1,2),(3,5),(4,7),…

這樣我們得到了這個(gè)數(shù)列的遞推式,以下我們把這兩個(gè)命題當(dāng)成是(a[n],b[n])的定義。

先證明兩個(gè)性質(zhì):

性質(zhì)一:核中的a[n],b[n]遍歷所有正整數(shù)。

[分析]:由命題一,二可得a[n],b[n]是遞增的,且由a[n]的定義顯然。

性質(zhì)二:A={a[n]:n=1,2,3,…},B={b[n]:n=1,2,3,…},則集合A,B不交。

[分析]:由核是內(nèi)固集,顯然。

看到這里大家有沒(méi)有想到Beatty序列呢,實(shí)際上a[n]和b[n]就是一個(gè)Beatty序列。

,有 ,解方程

得 ,到此,我們找到了該必?cái)B(tài)的通項(xiàng)公式。

實(shí)際上這組Beatty序列還有一些別的性質(zhì),比如當(dāng)一個(gè)數(shù)是Fibonacci數(shù)的時(shí)候,另一個(gè)數(shù)也是Fibonacci數(shù);而且兩者的比值也越來(lái)越接近黃金比,這些性質(zhì)在得到通項(xiàng)公式之后不難證明。

總的來(lái)說(shuō),這個(gè)問(wèn)題給我們了哪些啟示呢?首先用定理所說(shuō)的方法找核,然后給出核的規(guī)律(遞推,或是通項(xiàng))并且證明。最后附上一張對(duì)應(yīng)的必?cái)B(tài)圖.

轉(zhuǎn)自http://yjq24.blogbus.com/logs/42653430.html

?

上次說(shuō)了勝態(tài)和必?cái)B(tài),還記得最后的練習(xí)么?桌子上有15個(gè)石子,每人每次可以拿去1個(gè)或3個(gè)石子,拿走最后一個(gè)石子的人贏,列出所有的必?cái)B(tài):0,2,4,6,8,10,12,14。說(shuō)過(guò)了狀態(tài)作為結(jié)點(diǎn)可以畫一張有向圖,下面這張圖就是這個(gè)游戲所對(duì)應(yīng)的:

?

?

?

我只列了不大于6的狀態(tài),回顧一下勝態(tài)和必?cái)B(tài)的性質(zhì):

勝態(tài)一定可以通過(guò)某種策略走向必?cái)B(tài);而必?cái)B(tài)采取任何策略都將走向勝態(tài)。


用圖論的話來(lái)說(shuō),
因?yàn)楸財(cái)B(tài)只能走向勝態(tài),所以任何兩個(gè)必?cái)B(tài)結(jié)點(diǎn)之間不可能存在邊;
因?yàn)閯賾B(tài)總能走到必?cái)B(tài),所以對(duì)任何一個(gè)非必?cái)B(tài)的結(jié)點(diǎn),一定存在一個(gè)從它指向必?cái)B(tài)結(jié)點(diǎn)的邊。

不妨看看左圖中的0,2,4,6,親自體會(huì)一下。



定義:有向圖中,集合X中任意兩點(diǎn)之間無(wú)邊,稱集合X為內(nèi)固集。
定義:有向圖中,任意不在集合X中的點(diǎn)存在一條指向集合X的邊,稱集合X為外固集。

定義:有向圖中,集合X 既是外固集,又是內(nèi)固集,稱集合X為核。



顯然,內(nèi),外固集的定義正好針對(duì)上面的兩句話,而核就是包含所有必?cái)B(tài)的集合。



定理:雙人博弈中,約定走最后一步為勝,如果有核存在,則其中一方有不敗策略。

證明:不妨設(shè)A先行動(dòng),初始狀態(tài)不在核中,由于核是外固集,A一定可以采取某種策略把狀態(tài)走到核中,然后輪到B;由于核是外固集,所以B不管采取什么策略,都將走出核,所以輪到A的時(shí)候,A又可以把狀態(tài)走進(jìn)核里。總而言之,A可以使B永遠(yuǎn)面臨核內(nèi)的狀態(tài)。無(wú)路可走的狀態(tài)不可能在核外,因?yàn)楹送饪偰茏叩胶藘?nèi),A可以保持不敗。如果初始狀態(tài)不在核中,那么利用同樣的想法易知B有不敗策略。



以上的定理意義是非凡的,雖然這個(gè)定理在證明之前我們其實(shí)就已經(jīng)了解了核與必?cái)B(tài)的緊密聯(lián)系。那么,對(duì)一個(gè)博弈游戲來(lái)說(shuō),找出核是核心問(wèn)題。在此之前,先得考察核得存在性:

?

?

?

定理:有限個(gè)結(jié)點(diǎn)的無(wú)回路有向圖有唯一的核。

?

證明:核可以用如下的方式找出:首先找出沒(méi)有后繼結(jié)點(diǎn)的點(diǎn)集P[1](最基本的必?cái)B(tài),比如上圖中的結(jié)點(diǎn)0),然后找到那些指向P[1]的結(jié)點(diǎn)集合為N[1](最基本的勝態(tài),比如上圖的結(jié)點(diǎn)1和結(jié)點(diǎn)3);然后,除去P[1]和N[1]中的點(diǎn)并除去和這些點(diǎn)關(guān)聯(lián)的邊,繼續(xù)尋找沒(méi)有后繼結(jié)點(diǎn)的點(diǎn)集P[2](更高級(jí)的必?cái)B(tài),比如上圖中的結(jié)點(diǎn)2),依次類推,則最后的核為P=P[1]并P[2]并…并P[n]。

?

很容易說(shuō)明如此找到的核是內(nèi)固集,也是外固集,滿足核的定義,下面說(shuō)明一下核為什么不是空集:實(shí)際上P[1]就不是空集,對(duì)一個(gè)沒(méi)有回路的有向圖來(lái)說(shuō),從圖上的某一點(diǎn)出發(fā),就無(wú)法回到原來(lái)到過(guò)的點(diǎn)。而圖中的點(diǎn)又是有限的,所以最后必將在某個(gè)結(jié)點(diǎn)終止,故P不是空集。

?

針對(duì)不同的游戲,找核是一個(gè)麻煩事。首先生成圖,有向邊取決于游戲規(guī)則,然后當(dāng)我們要找某個(gè)必?cái)B(tài)的時(shí)候,是要先找到之前所有的必?cái)B(tài)的,而這正是一個(gè)數(shù)學(xué)問(wèn)題和一個(gè)編程問(wèn)題的關(guān)鍵差別。在立方和分解問(wèn)題[unsolved]中,我的問(wèn)題的提法都是針對(duì)某一個(gè)特定輸入的n來(lái)看是否存在(x,y)滿足立方和或者平方和等于n.實(shí)際上,如果提法換成,輸出對(duì)所有不大于n的數(shù)中可以被分解的數(shù),那么這種提法更適合計(jì)算機(jī)去解決,因?yàn)楸举|(zhì)上來(lái)說(shuō),兩個(gè)問(wèn)題是不一樣的。對(duì)于前者我只需要知道有關(guān)n的情況就可以了,而對(duì)后者,卻調(diào)動(dòng)了資源去計(jì)算所有不大于n的數(shù)的情況。雖然他們看起來(lái)很相近,但是從道理上來(lái)說(shuō)應(yīng)該后者的勞動(dòng)量要大得多,可悲的事情就在于,有時(shí)候你要算出n的情況,就不得不算一些比n小的數(shù)的情況,而這個(gè)計(jì)算的數(shù)目通常是隨著n增大而增大的;另一個(gè)可悲的事情是,程序員往往已經(jīng)習(xí)慣了第二種提問(wèn)方式。數(shù)學(xué)家希望找到某些必要條件或者充分條件來(lái)確定n能否被分解,同樣的道理,我們也希望能直接找到必?cái)B(tài)的規(guī)律,而不真正依賴于象上述定理那樣遞歸的思想從P[1]開(kāi)始找起,這樣來(lái)解決問(wèn)題。

?

但是,必?cái)B(tài)的規(guī)律是嚴(yán)格依賴于規(guī)則的,這一點(diǎn)對(duì)找出必?cái)B(tài)的規(guī)律來(lái)說(shuō)造成了很大的局限性。這個(gè)圖的模型在以后還會(huì)遇到,到時(shí)有更好的方法來(lái)尋找必?cái)B(tài)。

?

?轉(zhuǎn)自http://yjq24.blogbus.com/logs/42304551.html

?

高斯取整函數(shù)又叫向下取整函數(shù),常見(jiàn)的記法如下: ,既然是向下取整,也就是說(shuō)[-3.5]=-4,這個(gè)取整對(duì)負(fù)數(shù)來(lái)說(shuō)就不是簡(jiǎn)單地扔掉小數(shù)部分,這是要注意的。可以說(shuō),高斯取整是聯(lián)系連續(xù)和離散的重要橋梁。

?

小知識(shí):高斯函數(shù)性質(zhì)

1) x-1<[x]<=x<[x]+1

2) [x+n]=[x]+n,(n為整數(shù))

3) [x]+[y]<=[x+y]<=[x]+[y]+1 //左邊由性質(zhì)2易證,右邊利用[x+y]<=x+y<[x]+[y]+2

4) [nx]>=n[x],(n為正整數(shù)) //反復(fù)利用性質(zhì)3左邊

5) [x/n]=[[x]/n],(n為正整數(shù))

// 換元后等價(jià)于證[ny]/n-1<[y]<=[ny]/n,右邊由性質(zhì)4易證,左邊有 [ny]/n<=[y]+{y}<[y]+1

?

?

?

歐拉給出過(guò)一個(gè)很經(jīng)典的多項(xiàng)式: ,該多項(xiàng)式在n=0,1,2,…,39時(shí)產(chǎn)生40個(gè)素?cái)?shù)。利用高斯取整函數(shù),可以做 一件差不多的事:

?

,這個(gè)函數(shù)跳過(guò)所有的平方數(shù),而且值域覆蓋所有非完全平方數(shù)構(gòu)成的集合,有了上面的這些性質(zhì)作武器,證明并不難,這里就略去了。

?

今天的主題還是 Beatty定理 :

?

正無(wú)理數(shù) 滿足 , 則數(shù)列 ; 嚴(yán)格遞增, 并且這兩個(gè)數(shù)列構(gòu)成Z+上的一個(gè)分劃(也就是它們無(wú)交地遍歷全體正整數(shù))。

?

[題解]:

?

其實(shí)作為習(xí)題是不難的,顯然 ,于是 ,故

?

Step1.先證明兩數(shù)列不交:[反證]若 ,有 ,即有 ,

?

兩式相加:得k<m+n<k+1,這和m,n,k都是自然數(shù)矛盾;

?

Step2.再證兩數(shù)列能取遍所有的正整數(shù):[反證]若k不在 中,則有

?

于是

?

?

兩式分別除以 和 后相加:得 ,這和m,n,k都為自然數(shù)矛盾.

?

證畢.

?

由Beatty定理得到的兩個(gè)數(shù)列稱為互質(zhì)數(shù)列,不過(guò)別被名稱所欺騙,a[n]和b[n]并不能保證對(duì)應(yīng)互質(zhì)。

//再繼續(xù)看看必?cái)↑c(diǎn)

一、 m(k) = k * (1 + sqrt(5))/2 n(k) = m(k) + k ?二、 一個(gè)必?cái)↑c(diǎn)有如下性質(zhì): 性質(zhì)1:所有自然數(shù)都會(huì)出現(xiàn)在一個(gè)必?cái)↑c(diǎn)中,且僅會(huì)出現(xiàn)在一個(gè)必?cái)↑c(diǎn)中; 性質(zhì)2:規(guī)則允許的任意操作可將必?cái)↑c(diǎn)移動(dòng)到必勝點(diǎn); 性質(zhì)3:一定存在規(guī)則允許的某種操作可將必勝點(diǎn)移動(dòng)到必?cái)↑c(diǎn); 下面我們證明這3個(gè)性質(zhì)。 性質(zhì)1:所有自然數(shù)都會(huì)出現(xiàn)在一個(gè)必?cái)↑c(diǎn)中,且僅會(huì)出現(xiàn)在一個(gè)必?cái)↑c(diǎn)中; 證明:m(k)是前面沒(méi)有出現(xiàn)過(guò)的最小自然數(shù),自然與前k-1個(gè)必?cái)↑c(diǎn)中的數(shù)字都不同;m(k)>m(k-1),否則違背m(k-1)的選擇原則;n(k)=m(k)+k>m(k-1)+(k-1)=n(k-1)>m(k-1),因此n(k)比以往出現(xiàn)的任何數(shù)都大,即也沒(méi)有出現(xiàn)過(guò)。又由于m(k)的選擇原則,所有自然數(shù)都會(huì)出現(xiàn)在某個(gè)必?cái)↑c(diǎn)中。 性質(zhì)2:規(guī)則允許的任意操作可將必?cái)↑c(diǎn)移動(dòng)到必勝點(diǎn); 證明:以必?cái)↑c(diǎn)(m(k),n(k))為例。若只改變兩個(gè)數(shù)中的一個(gè),由于性質(zhì)1,則得到的點(diǎn)一定是必勝點(diǎn);若同時(shí)增加兩個(gè)數(shù),由于不能改變兩數(shù)之差,又有n(k)-m(k)=k,故得到的點(diǎn)也一定是必勝點(diǎn)。 性質(zhì)3:一定存在規(guī)則允許的某種操作可將必勝點(diǎn)移動(dòng)到必?cái)↑c(diǎn); 證明:以某個(gè)必勝點(diǎn)(i,j)為例,其中j>i。因?yàn)樗凶匀粩?shù)都會(huì)出現(xiàn)在某個(gè)必?cái)↑c(diǎn)中,故要么i等于m(k),要么j等于n(k)。 若i=m(k),j>n(k),可從j中取走j-n(k)個(gè)石子到達(dá)必?cái)↑c(diǎn); 若i=m(k),j<n(k),可從兩堆同時(shí)拿走m(k)-m(j-m(k)),注意此時(shí)j-m(k) < n(k)-m(k) < k,從而到達(dá)必?cái)↑c(diǎn)( m(j-m(k)),m(j-m(k))+j-m(k)); 若i>m(k),j=n(k),可從i中取走i-m(k)個(gè)石子到達(dá)必?cái)↑c(diǎn); 若i<m(k),j=n(k),需要再分兩種情況,因?yàn)閕一定也出現(xiàn)在某個(gè)必?cái)↑c(diǎn)中,若i=m(l),則從j中拿走j-n(l),若i=n(l),則從j中拿走j-m(l),從而到達(dá)必?cái)↑c(diǎn)(m(l),n(l))。

?

//看完上面的有了點(diǎn)了解吧,代碼如下:

#include<iostream> #include<cmath> using namespace std; int main () {int a,b,dif;double p=(sqrt((double)5)+1)/double(2);while(cin>>a>>b){dif=abs(a-b);//取差值a=a<b?a:b;//取較小的值if(a==(int)(p*dif))//判斷是不是奇異局勢(shì)printf("0\n");else printf("1\n");}return 0; }

?該類問(wèn)題另一種表述?

?移動(dòng)的皇后

Problem Description 一個(gè)n * n棋盤上有一個(gè)皇后。每個(gè)人可以把它往左或下或左下45度移動(dòng)任意多步。把皇后移動(dòng)至左下角的游戲者獲勝。現(xiàn)在給出皇后初始的X坐標(biāo)和Y坐標(biāo),如果輪到你先走,假設(shè)雙方都采取最好的策略,問(wèn)最后你是勝者還是敗者。

Input
輸入包含若干行,表示若干種皇后的初始情況,其中每一行包含兩個(gè)非負(fù)整數(shù)a和b,表示皇后的初始坐標(biāo),a和b都不大于1,000,000,000。 Output
輸出對(duì)應(yīng)也有若干行,每行包含一個(gè)數(shù)字1或0,如果最后你是勝者,則為1,反之,則為0。 Sample Input 2 1
8 4
4 7 Sample Output 0
1
0? C題的代碼: ? ? ?15ms 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 double x=(sqrt(5.0)+1)/2; 6 int a,b,t; 7 while(scanf("%d%d",&a,&b) != EOF) 8 { 9 if(a>b) 10 { 11 t=a; 12 a=b; 13 b=t; 14 } 15 if(floor(x*(b-a))==a) 16 printf("0\n"); 17 else printf("1\n"); 18 } 19 return 0; 20 }

D ??Sum? ? ??POJ 1844

給出一個(gè)數(shù)字n,求最小的i,1,2,3......i,數(shù)字之間+-都可。

解析:(不是出自我,原作者不詳)

*?一:sum一定要大于或等于輸入的S.(等于時(shí)就已經(jīng)找到了答案)

*????小于的話就算全做加法運(yùn)算也不能達(dá)到S

*?????????????

*?二:在滿足第一條的情況下,注意一定要滿足第一條后

*????第一次碰到(sum - S ) % 2 == 0

* 這里(?sum = 1 + 2??+ .... + i?)這時(shí)的i就是答案。

*??證明如下:

*???????????1:若res是奇數(shù),就說(shuō)明res =?(?1 + 2 + ... + i?)- S?是奇數(shù)

*?????????也就是說(shuō)無(wú)論你怎么改變sum(?sum = 1 + 2??+ .... + i?)表達(dá)式

*????????(當(dāng)然是通過(guò)改變其中的加號(hào)為減號(hào))也無(wú)法讓res0

*?????????????舉個(gè)例子吧:S = 5, sum = 1+2+3 = 6, res = 6 - 5 = 1;

*???無(wú)論改變(1+2+3)中的加號(hào)也沒(méi)用,這是因?yàn)槟阍?span lang="en-us">sum中改變一個(gè)加號(hào)為減號(hào)

????時(shí)它的值就一定減少了一個(gè)偶數(shù)值(這是顯然的)sum-S仍然為奇數(shù)

*????????2:令res = sum - S,則res一定是02,?4,?6....中的一個(gè)

*????????下面說(shuō)明總可以通過(guò)改變sum表達(dá)式中的某幾個(gè)加號(hào)為減號(hào)使得res0

*??????????當(dāng)k = 0的情況就不用說(shuō)明了吧, 假設(shè)2k表示res?顯然k = 1 2 3 4...

*????????????當(dāng)k = 1?時(shí)可以通過(guò)把sum(?sum = 1 + 2 + ... + i )

*????????????改成(?sum = -1 + 2 + ... + i )

*????????????當(dāng)k = 2?時(shí)可以通過(guò)把sum?(?sum = 1 + 2 + ... + i )

*????????????改成( sum = 1 - 2 + ... + i )

*????????????一次類推res總可以變?yōu)?span lang="en-us">0

1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 int main() 5 { 6 int n,sum,i; 7 while(~scanf("%d",&n)) 8 { 9 i=0; 10 sum=0; 11 while(sum<n || (sum-n)%2==1) 12 { 13 sum+=++i; 14 } 15 printf("%d\n",i); 16 } 17 return 0; 18 }

E ? 最短路問(wèn)題 ? DFS+Dijkstra ? ?A Walk Through the Forest? ? ?HDU 1142?

代碼: ? ?125MS

1 #include <iostream> 2 #include <cstring> 3 #define N 1010 4 #define INF 1000000 5 using namespace std; 6 int map[N][N],v[N],dis[N],dp[N]; 7 int n,m; 8 void dij(int start) //終點(diǎn)到每個(gè)點(diǎn)的最短路徑(單源最短路徑) 9 { 10 int m,x; 11 memset(v,0,sizeof(v)); 12 for(int i=1;i<=n;i++) 13 dis[i]=map[start][i]; 14 dis[start]=0; 15 v[start]=1; 16 for(int i=1;i<=n;i++) 17 { 18 m=INF; 19 for(int j=1;j<=n;j++) 20 if(!v[j]&&dis[j]<m) m=dis[x=j]; 21 if(m==INF) break; 22 v[x]=1; 23 for(int j=1;j<=n;j++) 24 if(!v[j]&&dis[j]>dis[x]+map[x][j]) 25 dis[j]=dis[x]+map[x][j]; 26 } 27 } 28 int dfs(int s) 29 { 30 int sum=0; 31 if(dp[s]>-1) 32 return dp[s]; 33 if(s==2) 34 return 1; //到達(dá)終點(diǎn) 35 for(int i=1;i<=n;i++) 36 { 37 if(map[s][i]!=INF&&dis[i]<dis[s]) //s到i有路且s到終點(diǎn)距離大于i到終點(diǎn)的距離 38 sum+=dfs(i); //路徑條數(shù)累加 39 } 40 dp[s]=sum; 41 return dp[s]; 42 } 43 int main() 44 { 45 int a,b,l; 46 while(cin>>n,n) 47 { 48 cin>>m; 49 for(int i=1;i<=n;i++) 50 { 51 dp[i]=-1; 52 for(int j=1;j<=n;j++) 53 map[i][j]=INF; //不存在的邊為INF 54 } 55 while(m--) 56 { 57 cin>>a>>b>>l; 58 map[a][b]=map[b][a]=l; 59 } 60 dij(2); //2為終點(diǎn) 61 cout<<dfs(1)<<endl; //從1開(kāi)始搜 62 63 } 64 return 0; 65 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/riddle/p/3259254.html

總結(jié)

以上是生活随笔為你收集整理的8月14小练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。