青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····
今天做ural 1002,題目描述:
1002. Phone numbers
Time Limit: 2.0 second
Memory Limit: 16 MB

Background

In the present world you frequently meet a lot of call numbers and they are going to be longer and longer. You need to remember such a kind of numbers. One method to do it in an easy way is to assign letters to digits as shown in the following picture:

	1 ij	2 abc	3 def
4 gh	5 kl	6 mn
7 prs	8 tuv	9 wxy
0 oqz
This way every word or a group of words can be assigned a unique number, so you can remember words instead of call numbers. It is evident that it has its own charm if it is possible to find some simple relationship between the word and the person itself. So you can learn that the call number 941837296 of a chess playing friend of yours can be read as WHITEPAWN, and the call number 2855304 of your favourite teacher is read BULLDOG.

 

Problem

Write a program to find the shortest sequence of words (i.e. one having the smallest possible number of words) which corresponds to a given number and a given list of words. The correspondence is described by the picture above.

Input

Input contains a series of tests. The first line of each test contains the call number, the transcription of which you have to find. The number consists of at most 100 digits. The second line contains the total number of the words in the dictionary (maximum is 50000). Each of the remaining lines contains one word, which consists of maximally 50 small letters of the English alphabet. The total size of the input file doesn't exceed 300KB. The last line of input file contains call number -1.

Output

Each line of output contains the shortest sequence of words which has been found by your program. The words are separated by single spaces. If there is no solution to the input data, the line contains text "No solution.". If there are more solutions having the minimum number of words, you can choose any single one of them.

Sample

input
output
7325189087
            5
            it
            your
            reality
            real
            our
            4294967296
            5
            it
            your
            reality
            real
            our
            -1
            
reality our
            No solution.
            


思路就是dp,狀態轉移是dp[i]=min(dp[i-len[j]]+1)(1<=j<=n)
code:
#include <iostream>
#include 
<string>
#include 
<algorithm>
#include 
<stack>
#include 
<vector>

using namespace std;
//#pragma comment(linker, "/STACK:16777216")

const int N=105;
const int M=50001;
int dp[N];
int pathone[N];
int pathtwo[N];
int hash[26]={2,2,2,3,3,3,4,4,1,1,5,5,6,6,0,7,0,7,7,8,8,8,9,9,9,0};
vector
<string> vec,v;
vector
<int> ve;
void Init()
{
    memset(dp,
0,sizeof(dp));
    memset(pathone,
0,sizeof(pathone));
    memset(pathtwo,
0,sizeof(pathtwo));
    vec.clear();
    v.clear();
    ve.clear();
};
int main()
{
    
string ss;
    
while(cin>>ss){
        
if(ss=="-1")break;
        Init();
        
int n;
        cin
>>n;
        
string str;
        
for(int i=0;i<n;i++){
            cin
>>str;
            v.push_back(str);
            
string tmp;
            
for(int j=0;j<str.size();j++){
                tmp
+=hash[str[j]-'a']+48;
            }
            vec.push_back(tmp);
        }
        dp[
0]=1;
        
for(int i=1;i<=ss.size();++i){
            
for(int j=0;j<vec.size();++j){
                
if(i-vec[j].size()>=0&&dp[i-vec[j].size()]>0){
                                   
if(vec[j]==ss.substr(i-vec[j].size(),vec[j].size())&&(dp[i]==0||dp[i]>dp[i-vec[j].size()]+1)){
                        dp[i]
=dp[i-vec[j].size()]+1;
                        pathone[i]
=j;
                        pathtwo[i]
=i-vec[j].size();
                    }
                }
            }
        }
        
if(dp[ss.size()]==0){
            cout
<<"No solution.\n";
        }
        
else{
            
int mm=ss.size();
            
//ve.push_back(mm);
            while(mm!=0){
                
//stk.push(v[pathone[mm]]);
                ve.push_back(mm);
                mm
=pathtwo[mm];
                
            }
            
for(int i=ve.size()-1;i>=0;i--){
                
if(i==ve.size()-1)cout<<v[pathone[ve[i]]];
                
else cout<<" "<<v[pathone[ve[i]]];
            }
            cout
<<endl;
        }
    }
    
return 0;
}
以上code ,(Crash), 看了FAQ,相當于STACK_OVERFLOW ,先是郁悶。。。。
玩了花了N多時間查找哪錯問題了。。。。
沒辦法時加了句 i-vec[j].size()<N于是奇跡出現了Accepted.....汗
于是想問下各位路過大牛,,題目明顯是i<N,i-vec[j].size()<N不是就成了句廢話了。。。。無語.....
我碰到類似dp,用dp[i+len[j]]>dp[i]+1 dp[i+len[j]]=dp[i]+1轉換下,就不會出現此問題,,而用dp[i-len[j]]+1<dp[i],dp[i]=dp[i-len[j]]+1問題就出現了。。。RE,所以想問下原因,,,我以保證i-len[j]>=0&&i-len[j]<N(dp[N])
posted @ 2008-04-05 16:21 小果子 閱讀(304) | 評論 (0)編輯 收藏
1.在C++語言中,當結構體中存在指針型成員時,我們需要重寫struct 的拷貝構造函數并進行“=”操作符重載,如果你本意不想指向同快內存.
posted @ 2008-03-27 22:52 小果子 閱讀(208) | 評論 (0)編輯 收藏

構造函數
bitset<n> b;
b有n位,每位都為0.參數n可以為一個表達式.
如bitset<5> b0;則"b0"為"00000";

bitset<n> b(unsigned long u);
b有n位,并用u賦值;如果u超過n位,則頂端被截除
如:bitset<5>b0(5);則"b0"為"00101";

bitset<n> b(string s);
b是string對象s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval4 );
則"b0"為"10011";


bitset<n> b(s, pos);
b是s中從位置pos開始位的副本,前面的多余位自動填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval5, 3 );
則"b0" 為 "0000011010";

bitset<n> b(s, pos, num);
b是s中從位置pos開始的num個位的副本,如果num<n,則前面的空位自動填充0;
string bitval ("11110011011");
bitset<6> b0 ( bitval5, 3, 6 );
則"b0" 為 "100110";


os << b
把b中的位集輸出到os流
os >>b
輸入到b中,如"cin>>b",如果輸入的不是0或1的字符,只取該字符前面的二進制位.

bool any( )
是否存在置為1的二進制位?和none()相反

bool none( )
是否不存在置為1的二進制位,即全部為0?和any()相反.

size_t count( )
二進制位為1的個數.

size_t size( )
二進制位的個數

flip()
把所有二進制位逐位取反

flip(size_t pos)
把在pos處的二進制位取反

bool operator[](   size_type _Pos )
獲取在pos處的二進制位

set()
把所有二進制位都置為1

set(pos)
把在pos處的二進制位置為1

reset()
把所有二進制位都置為0

reset(pos)
把在pos處的二進制位置為0

test(size_t pos)
在pos處的二進制位是否為1?

unsigned long to_ulong( )
用同樣的二進制位返回一個unsigned long值

string to_string ()

posted @ 2008-02-24 20:43 小果子 閱讀(823) | 評論 (0)編輯 收藏

在計算機圖形運算中,常常要將浮點數轉換為整數,例如在圖像的光柵化階段,就要執行大量的類型轉換,以便將浮點數表示的坐標轉化為整數表示的屏幕坐標。Ok,it's so easy:
----------------------------------------------------------------------------------------
//
// 強制類型轉換
// 小數部分將被裁剪掉
//
int_val = (int)float_val;
----------------------------------------------------------------------------------------
嘿嘿,很高興你居然和我一樣單純!這個操作實在是太TINY了,以至于我從來沒想過它是怎么實現的,直到某天某個家伙跟我說,不要使用標準C類型轉換,因為那太慢了!我當時的震驚不下于倒霉的冒險者遇上了龍。

標準C類型轉換最大的優點是,它是獨立于平臺的,無論是在X86上跑,還是在PowerPC上跑,你什么都不用擔心,編譯器會為你搞定一切。而這也恰恰是它最大的缺點——嚴重依賴于編譯器的實現。而實際測試表明,編譯器所生成的代碼,其速度實在不盡人意。

一個替代的方法是直接對數據位進行操作。如果你對IEEE浮點數的表示法比較熟悉的話(如果你壓根什么都不知道,請先查閱文末附錄中的資料),這是顯而易見的。它提取指數和尾數,然后對尾數執行移位操作。代碼如下:
----------------------------------------------------------------------------------------
//
// 將32位浮點數fval轉換為32位整數并存儲在ival中
// 小數部分將被裁剪掉
//
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval;

// 提取尾數
// 注意實際的尾數前面還有一個被省略掉的1
int mantissa = (ival & 0x07fffff) | 0x800000;

// 提取指數
// 以23分界,指數大于23則左移,否則右移
// 由于指數用偏移表示,所以23+127=150
int exponent = 150 - ((ival >> 23) & 0xff);

if (exponent < 0)
ival = (mantissa << -exponent);
else
ival = (mantissa >> exponent);

// 如果小于0,則將結果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
----------------------------------------------------------------------------------------
該函數有一個BUG,那就是當fval=0時,返回值是2。原因是對于語句mantissa>>exponent,編譯器使用了循環移位指令。解決方法是要么對0作特殊處理,要么直接用匯編來實現。

這個函數比標準的C轉換要快,而且由于整個過程只使用了整數運算,可以和FPU并行運行。但缺點是,(1)依賴于硬件平臺。例如根據小尾和大尾順序的不同,要相應地修改函數。(2)對于float和double要使用不同的實現,因為二者的數據位不同。(3)對于float,只能保留24位有效值,盡管int有32位。

更快的方法是使用FPU指令FISTP,它將棧中的浮點數彈出并保存為整數:
----------------------------------------------------------------------------------------
//
// 將64位浮點數fval轉換為32位整數并存儲在ival中
// 小數部分將四舍五入到偶數
//
inline void RoundToIntFPU (int &ival, double fval)
{
_asm
{
fld fval
mov edx, dword ptr [ival]
fistp dword ptr [edx]
}
}
----------------------------------------------------------------------------------------
很好,無論速度還是精度似乎都相當令人滿意。但如果換一個角度來看的話,fistp指令需要6個cycle,而浮點數乘法才僅僅需要3個cycle!更糟的是,當fistp運行的時候,它必須占用FPU,也就是說,其他的浮點運算將不能執行。僅僅為了一次類型轉換操作就要付出如此大的代價,光想想就覺得心疼。

當然,它也有很多優點:更快的速度,更精確的數值(四舍五入到偶數),更強的適用性(float和double均可)。要注意的是,FPU默認的四舍五入到偶數(round to even)和我們平常所說的四舍五入(round)是不同的。二者的區別在于對中間值的處理上。考慮十進制的3.5和4.5。四舍五入到偶數是使其趨向于鄰近的偶數,所以舍入的結果是3.5->4,4.5->4;而傳統的四舍五入則是3.5->4,4.5->5。四舍五入到偶數可以產生更精確,更穩定的數值。

除此之外,還有更好,更快的方法嗎?有的,那就是華麗的 Magic Number !

請看下面的函數:
----------------------------------------------------------------------------------------
//
// 將64位浮點數轉換為32位整數
// 小數部分將四舍五入到偶數
//
inline void RoundToInt64 (int &val, double dval)
{
static double magic = 6755399441055744.0;
dval += magic;
val = *(int*)&dval;
}
----------------------------------------------------------------------------------------
快,這就是它最偉大的地方!你所需要的僅僅是一次浮點數加法,你還能再奢望些什么呢?

當然,絕對不要使用莫名其妙的代碼,現在馬上就讓我們來看看它是怎么變的戲法。

首先,我們要搞清楚FPU是怎樣執行浮點數加法的。考慮一下8.75加2^23。8.75的二進制表示是1000.11,轉化為IEEE標準浮點數格式是1.00011*2^3。假設二者均是32位的float,它們在內存中的存儲為:
----------------------------------------------------------------------------------------
符號位(31), 指數(30-23), 尾數(22-0)

8.75: 0, 10000010, 0001 1000 0000 0000 0000 000

2^23: 0, 10010110,0000 0000 0000 0000 0000 000
----------------------------------------------------------------------------------------
FPU所執行的操作是:(1)提升指數較小者的指數,使二者指數相同;(2)將二者的尾數相加;(3)將結果規整為標準格式。讓我們具體來看看整個過程:
----------------------------------------------------------------------------------------
1,提升8.75的指數,尾數要相應地右移23-3=20位:

8.75 = 1.00011*2^3 = .0000000000000000000100011*2^23

2,將二者相加。必須注意的是,
   由于float只有23位尾數,所以8.75的低位被移除掉了:

8.75: 0, 10010110, 0000 0000 0000 0000 0001 000
 +
2^23: 0, 10010110,0000 0000 0000 0000 0000 000
 =
0, 10010110, 0000 0000 0000 0000 0001 000

3,將規整為標準格式:

別忘了2^23還有個前導1,所以結果是規整的,無需執行任何操作
----------------------------------------------------------------------------------------
你發現什么了嗎?不錯,將結果的尾數部分提取出來,正是int(8.75)!是的,magic number的奧妙就在這里,通過迫使FPU將尾數移位,從而獲得我們需要的結果。

但是別高興得太早,讓我們來看看負數的情況。以-8.75為例,-8.75加2^23相當于2^23減去8.75,過程如下:
----------------------------------------------------------------------------------------
2^23: 0, 10010110,0000 0000 0000 0000 0000 000
 -
8.75: 0, 10010110, 0000 0000 0000 0000 0001 000
 =
0, 10010110, 1111 1111 1111 1111 1110 000
----------------------------------------------------------------------------------------
很好,尾數部分正是int(-8.75)=-8的補碼。然而,2^23的前導1在減法過程中被借位了,所以結果的尾數前面并沒有1,FPU將執行規整操作,最后我們得到的是:
----------------------------------------------------------------------------------------
0, 10010110, 1111 1111 1111 1111 1100 000
----------------------------------------------------------------------------------------
功虧一簣!等等,如果將2^23的尾數的最高位置1,那么在減法過程中不就可以保全前導1了嗎?完全正確,這就是我們需要的。所以最后的magic number是0,10010110,1000 0000 0000 0000 0000 000,也就是1.5*2^23。

然而,我們要清楚這個方法的一些局限性。首先,在將結果的float值保存為整數時,我們需要使用某些mask值將22-31位屏蔽掉。其次,float只能保有最多23位的有效值,在將尾數最高位置1后,有效值更是降到了22位,這意味著我們對大于2^23-1的數值無能為力。

相比之下,如果我們只處理double,那么所有的問題就都迎刃而解了。首先,double的指數位,符號位和尾數的最高位全部都在高32位,無需屏蔽操作。其次,double有多達52位的尾數,對于32位的int來說,實在是太奢侈了!

用于double的magic number是1.5*2^52=6755399441055744.0,推導過程是一樣的。

根據同樣的原理,我們還可以計算出將float和double轉化為定點數的magic number。例如對于16-16的定點數,尾數右移的位數比原先轉化為整數時要少16,所以對于double來說,相應的magic number就是1.5*2^36。如果要轉化為8-24的定點數,則移位次數要少24,magic number是1.5*2^28。對于其他格式的定點數,以此類推。比起int(float_val*65536)這樣的表達式,無論是速度還是精度都要優勝得多。

另外,不得不再次重申的是,對于在最后的結果中被移除掉的數值,FPU會將其四舍五入到偶數。然而,有時我們確實需要像floor和ceil那樣的操作,那該怎么辦呢?很簡單,將原數加上或減去一個修正值就可以了,如下所示:
----------------------------------------------------------------------------------------
// 修正值
static double magic_delta=0.499999999999;

// 截取到整數
inline void Floor64 (int &val, double dval)
{
RoundToInt64(val,dval-delta);
}

// 進位到整數
inline void Ceil64 (int &val, double dval)
{
RoundToInt64(val,dval+delta);
}
----------------------------------------------------------------------------------------
這個世界上沒有免費的午餐。我們獲得了速度,相對應地,也必須付出一些代價,那就是可移植性。上述方法全都基于以下幾個假設:(1)在x86上跑;(2)符合IEEE的浮點數標準;(3)int為32位,float為32位,double為64位。局限性其實是蠻大的,相比之下,int_val=(int)float_val就要省事多了。當然,你也可以使用條件編譯。

最后,讓我們來看兩組實際的測試數值。這份報告來自于Sree Kotay和他的朋友Herf:
----------------------------------------------------------------------------------------
平臺:Pentium IV/1.2

64位浮點數到32位整數的轉換:

int(f):        2772.65 ms
fistp:         679.269 ms
magic number:  622.519 ms

64位浮點數到16-16定點數的轉換:

int(f*65536):  2974.57 ms
fistp:         3100.84 ms
magic number:  606.80 ms

floor函數:

ANSI floor:    7719.400 ms
magic number:  687.177 ms
----------------------------------------------------------------------------------------
平臺:Pentium D/3.2

64位浮點數到32位整數的轉換:

int(f):        1948.470 ms
fistp:         523.792 ms
magic number:  333.033 ms

64位浮點數到16-16定點數的轉換:

int(f*65536):  2163.56 ms
fistp:         7103.66 ms
magic number:  335.03 ms

floor函數:

ANSI floor:    3771.55 ms
magic number:  380.25 ms
----------------------------------------------------------------------------------------
性能的差距實在令人驚訝,不是嗎?我想說的是,寫編譯器的家伙絕對不是傻瓜(恐怕比你我都要聰明得多),他們當然知道所有這些優秀的算法。但為什么編譯器的表現會如此糟糕呢?其中一個理由是,為了使浮點數運算盡可能精確和迅速,IEEE在算法的選擇上有很多的限制。而另一方面,IEEE的舍入規則(四舍五入到偶數)盡管從維持浮點數的連貫性上來看非常棒,但卻不符合ANSI C在浮點數到整數的類型轉換上的說明(截尾)。于是,編譯器不得不做一大堆的工作來保證行為的正確性(符合標準)。這在大部分情況下都不是什么問題——除非你在寫圖形/聲音/多媒體之類的代碼。

剛剛在我的賽揚1.1G上實際測試了一下。編譯器是VC2003,使用PerformenceCounter來計算時間,在DEBUG模式下,C標準轉換/FISTP/MagicNumber三種方法所耗費時間的比約為5/3/2。但在優化全開的RELEASE模式下,標準C類型轉換的速度卻是遙遙領先于所有其他的方法!也不知道是我的測試方法有問題,還是該贊VS厲害。
--------------------------------------------------------------------------------------
參考文獻和相關資源可到鄙人的小店下載:http://greatsorcerer.go2.icpcn.com/info/float2int.html

1,What Every Computer Scientist Should Know About Floating-Point Arithmetic by David Goldberg(PDF):
這篇論文囊括了關于浮點數的所有東西,正如其名字所示,任何想要了解浮點數的人都必讀的文獻。(其中關于精度的討論實在令我受益非淺。) 

2,Let's Get to The Floating Point by Chris Hecker(PDF):
早期的關于浮點數的文章,寫得非常棒,值得一看。
 
3,IEEE Standard 754 for Binary Floating Point Arithmetic by Prof.W.Kahan(PDF):
關于IEEE754標準的說明。 

4,IA64 Floating Point Operations and the IEEE Standard for Binary Floating Point Arithmetic(PDF):
關于IA64的浮點數實現。 

5,Know Your FPU: Fixing Floating Fast by Sree Kotay 

posted @ 2008-01-31 22:23 小果子 閱讀(7330) | 評論 (6)編輯 收藏

兩人游戲: 給定K堆火柴,每堆火柴數為N1,N2,N3,...Nk,
兩人輪流拿,看誰拿到最后一根火柴誰就勝利。
    規則:每次只能從一堆中拿,每次至少拿一根,最多可拿光。
假若我先走,求教我必勝的策略。
    比如:有三堆,1  2  3

---------------------------------------------------------------

求出 N = N1^N2^N3^…^Nk (“^”為C++中的按位異或運算符)。
若 N 等于零,稱此狀態為必勝狀態,否則稱為非必勝狀態。
從必勝狀態中改小一個且只改小一個數字是不可能到達另一個必勝狀態的。
從非必勝狀態中一定可以找到一個數n,使得n<Ni且N1^N2^…^Ni-1^n^Ni+1^…^Nk=0 (其中1<=i<=k),也就是說從非必勝狀態一定可以只改小一個數字而到達必勝狀態。
若某一方保證每次拿火柴后當前狀態都是必勝狀態,此方將勝出(當然要求相對此方的初始狀態為非必勝狀態)。

---------------------------------------------------------------

發信人: Nature (成長●快樂●煩惱), 信區: Mathematics
標  題: 關于取火柴問題的解答
發信站: 南京大學小百合站 (Tue May  7 09:22:18 2002), 站內信件

題目1:    今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根,
可將一堆全取走,但不可不取,最后取完者為勝,求必勝的方法。

題目2:    今有若干堆火柴,兩人依次從中拿取,規定每次只能從一堆中取若干根,
可將一堆全取走,但不可不取,最后取完者為負,求必勝的方法。

解答如下:

先解決第1題

定義1:若所有火柴數異或為0,則該狀態被稱為利他態,用字母T表示;否則,
為利己態,用S表示。

定理1:對任何S態,存在方法,從其中取一堆中的若干根,使狀態變為T態。
引理1.1 :A(i)為非副整數,i=1..n, 記c=A(1) xor A(2) xor ……  xor A(n),

若c>0,則存在A(t), A(t) xor c <A(t)
證明: 把c表示成二進制,記它的二進制數的最高位為第p位,
  則必然存在一個A(t),它二進制的第p位也是1。(否則,若所有的A(i)的第p位都是0,
c的第p位就也為0,矛盾!)
  x=a(t) xor c 的第p位將為1 xor 1,即0;
  又因為c的最高位為p,所以x高于p位的值不變。所以必有x<a(t).即a(t) xor 
c<a(t)
.
  命題得證。

再來證定理1.
證明:
 設共有n堆火柴,每堆的數目分別為A(i),i=1..n,A(i)為非副整數.
 記c=A(1) xor A(2) xor ……  xor A(n),
 因為是S態,所以 c>0;
 所以存在A(t), A(t) xor c <A(t)。
 A(t)' = A(t) xor c <A(t)
  c' = A(1) xor A(2) xor …  xor A(t)' xor … xor A(n)
   = A(1) xor A(2) xor …  xor A(t) xor c xor … xor A(n)
   = A(1) xor A(2) xor …  xor A(t) xor … xor A(n) xor c
   = c xor c = 0
所以,用把第t堆由A(t)根取成A(t)' 根(A(t)' = A(t) xor c <A(t) ),狀態成
為T態。
故命題成立。    #

定理2:T態,取任何一堆的若干根,都將成為S態。
證明:反證法:
  反設存在一堆,記為第m堆,從中取了若干根,根數由A(m)變為A(m)' .
  A(m)>A(m)' 狀態均為T態。
  記c=A(1) xor A(2) xor … xor A(m) xor…  xor A(n),
  記c'=A(1) xor A(2) xor … xor A(m)' xor…  xor A(n),
  c=0;c'=0;
  所以有 0= A(1) xor A(2) xor … xor A(m) xor…  xor A(n)
= A(1) xor A(2) xor … xor A(m-1) xor A(m+1) xor… xor A(n) xor A(m)
= d xor A(m)
     d= A(1) xor A(2) xor … xor A(m-1) xor A(m+1) xor… xor A(n)
故 A(m)=d
        同理, d xor A(m)' =0
   A(m)'= d
  所以,A(m)'=A(m) . 矛盾!
  故反設不成立。原命題成立。 #

定理 3:S態,只要方法正確,必贏。
 最終勝利即由S態轉變為T態,任何一個S態,只要把它變為T態,(由定理一,
可以把它變成T態。)對方只能把T態轉變為S態(定理2)。這樣,所有S態向T態的轉變都可以
有己方控制,對方只能被動地實現由T態轉變為S態。故S態必贏。 #
定理4:T態,只要對方法正確,必敗。
 由定理3易得。


我們再來處理第2題。我們會發現兩題會有一些相同之處,控制S->T態的人控制著
主動權
。經過分析,我們有以下結論:
定義2:若一堆中僅有1根火柴,則被稱為孤單堆。若大于1根,則稱為充裕堆。
定義3:T態中,若充裕堆的堆數大于等于2,則稱為完全利他態,用T2表示;若充
裕堆的堆數等于0,則稱為部分利他態,用T0表示。
定理4:不存在充裕堆數為1的T態。
證明:
 孤單堆的根數異或只會影響二進制的最后一位,但充裕堆會影響高位(非最后一位)。

 一個充裕堆,高位必有一位不為0,則所有根數異或不為0。故不會是T態。
定義4:S態中,若充裕堆的堆數大于等于2,則稱為完全利己態,用S2表示;若充
裕堆的堆數等于1,則稱為自主利己態,用S1表示; 若充裕堆的堆數等于0,則稱為部分利
己態,用S0表示。

定理4:S0態,即僅有奇數個孤單堆,必敗。T0態必勝。
證明:S0態,其實就是每次只能取一根。每次第奇數根都由己取,第偶數根都由對
方取,所以最后一根必己取。敗。
  同理, T0態必勝#
定理5:S1態,只要方法正確,必勝。
證明:若此時孤單堆堆數為奇數,把充裕堆取完;否則,取成一根。
   這樣,就變成奇數個孤單堆,由對方取。
   由定理4,對方必輸。己必勝。 #
定理6:S2態不可轉一次變為T0態。
證明:充裕堆數不可能一次由2變為0。得證。 #
定理7:S2態可一次轉變為T2態。
證明:由定理1,S態可轉變為T態,態可一次轉變為T態
   又由定理6,S2態不可轉一次變為T0態,
   所以轉變的T態為T2態。 #
定理8:T2態,只能轉變為S2態或S1態。
證明:. 由定理2,T態必然變為S態。
     由于充裕堆數不可能一次由2變為0,所以此時的S態不可能為S0態。
  命題得證。
定理9:S2態,只要方法正確,必勝.
證明:方法如下:
   1) S2態,就把它變為T2態。(由定理7)
   2) 對方只能T2轉變成S2態或S1態(定理8)
  若轉變為S2, 轉向1)
  若轉變為S1, 這己必勝。(定理5)
定理10:T2態必輸。
證明:同9。
 綜上所述,必輸態有: T2,S0
     必勝態:   S2,S1,T0.
兩題比較:
第一題的全過程其實如下:
 S2->T2->S2->T2-> …… ->T2->S1->T0->S0->T0->……->S0->T0(全0)
第二題的全過程其實如下:
 S2->T2->S2->T2-> …… ->T2->S1->S0->T0->S0->……->S0->T0(全0)
下劃線表示勝利一方的取法。
    是否發現了他們的驚人相似之處。
我們不難發現(見加黑部分),S1態可以轉變為S0態(第二題做法),也可以轉變為
T0(第一題做法)。哪一方控制了S1態,他即可以有辦法使自己得到最后一根(轉變為
T0),也可以使對方得到最后一根(轉變為S0)。
 所以,搶奪S1是制勝的關鍵!
 為此,始終把T2態讓給對方,將使對方處于被動狀態,他早晚將把狀態變為S1.
(見定理9的證明).

posted @ 2008-01-28 10:51 小果子 閱讀(206) | 評論 (0)編輯 收藏
僅列出標題
共58頁: First 50 51 52 53 54 55 56 57 58 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩综合一区| 欧美一级午夜免费电影| 国产乱肥老妇国产一区二| 欧美日本在线一区| 夜夜嗨av色综合久久久综合网| 久久久噜噜噜久久中文字免| 久久精品最新地址| 国产欧美日韩在线观看| 国产精品毛片a∨一区二区三区|国| 亚洲小视频在线观看| 99国产精品久久久| 夜夜精品视频| 国产资源精品在线观看| 在线观看欧美| 亚洲精选中文字幕| 国产精品99久久不卡二区| 亚洲一区二区四区| 亚洲一区二区精品视频| 国产精品久久久久一区二区| 亚洲一区日韩| 亚洲一区日韩| 亚洲伊人伊色伊影伊综合网| 99精品国产99久久久久久福利| 亚洲国产成人av| 欧美精品午夜视频| 欧美国产亚洲另类动漫| 99精品欧美一区| 中日韩美女免费视频网址在线观看| 国产精品国产三级国产aⅴ浪潮| 亚洲视频axxx| 亚洲一区二区三区色| 国产精品日本精品| 亚洲视频中文| 午夜综合激情| 最新国产精品拍自在线播放| 日韩一区二区精品视频| 欧美日韩国产大片| 欧美伊人精品成人久久综合97| 亚洲一区二区精品| 国产亚洲欧美在线| 亚洲伦理精品| 国内精品久久久| 在线性视频日韩欧美| 91久久夜色精品国产网站| 亚洲香蕉伊综合在人在线视看| 最新国产成人av网站网址麻豆 | 一本久道久久综合中文字幕| 国产日韩欧美| 亚洲精品免费在线播放| 黑人一区二区| 亚洲综合999| 亚洲与欧洲av电影| 欧美极品在线视频| 亚洲国产成人午夜在线一区 | 久久中文字幕导航| 性做久久久久久久免费看| 欧美成人a视频| 欧美va天堂va视频va在线| 国产精品综合不卡av| 制服诱惑一区二区| 亚洲视频一区二区在线观看 | 久久av在线看| 亚洲女同在线| 国产精品二区二区三区| 亚洲精选中文字幕| 一区二区三区欧美在线| 欧美精品一区二区三区在线看午夜| 欧美成人免费全部| 在线观看日韩欧美| 久久青草福利网站| 免费看成人av| 亚洲国产免费看| 欧美激情综合五月色丁香小说| 亚洲福利视频三区| 亚洲三级免费电影| 欧美日韩亚洲一区二区三区在线 | 亚洲高清视频中文字幕| 亚洲国产日韩欧美在线图片| 老司机免费视频一区二区| 欧美国产日韩一区二区| 日韩视频在线你懂得| 欧美了一区在线观看| 99精品国产在热久久| 亚洲在线视频| 国产日韩精品一区二区| 久久精品亚洲热| 亚洲高清久久久| 一本不卡影院| 国产精品亚洲第一区在线暖暖韩国| 欧美一区二区视频免费观看 | 亚洲欧洲一区二区三区久久| 欧美福利电影在线观看| 在线视频欧美日韩| 久久久久国产精品麻豆ai换脸 | 欧美日韩国产精品成人| 中文在线一区| 久久这里有精品视频| 亚洲免费电影在线| 国产精品伊人日日| 久久夜色精品国产| 一区二区三区久久| 久久蜜臀精品av| 亚洲精品午夜| 国产欧美日韩精品一区| 免费在线欧美黄色| 亚洲欧美日本国产有色| 欧美成人亚洲成人日韩成人| 亚洲视频视频在线| 欲香欲色天天天综合和网| 欧美日产国产成人免费图片| 欧美一区二区性| 日韩视频在线一区| 久久一区二区三区四区五区| 亚洲天堂偷拍| 亚洲精品乱码久久久久久蜜桃91| 国产精品久久午夜夜伦鲁鲁| 欧美国产一区二区在线观看| 篠田优中文在线播放第一区| 亚洲日本中文字幕免费在线不卡| 久久久伊人欧美| 亚洲综合电影一区二区三区| 亚洲人成网站999久久久综合| 国产一区二区成人| 国产精品捆绑调教| 欧美日韩三区| 欧美不卡在线视频| 久久永久免费| 久久亚洲欧美国产精品乐播| 亚洲欧美日韩精品久久奇米色影视| 亚洲日本在线观看| 欧美电影免费| 欧美第一黄网免费网站| 久久夜色精品国产欧美乱| 欧美一区二区三区在线看 | 韩国一区电影| 国产精品一二三视频| 欧美视频网址| 欧美日本中文| 欧美日韩精品一区二区三区四区 | 欧美精品在线看| 久久色在线播放| 久久久av毛片精品| 久久9热精品视频| 久久激情久久| 久久精品国产亚洲a| 欧美一区二区高清| 久久国产精品99国产| 久久er精品视频| 久久蜜桃香蕉精品一区二区三区| 欧美一站二站| 久久久午夜精品| 久久夜色精品| 欧美高清在线视频观看不卡| 欧美国产日本在线| 欧美日韩一区二区视频在线 | 欧美亚洲视频| 久久精品国产精品| 老鸭窝亚洲一区二区三区| 免费观看成人www动漫视频| 美女黄色成人网| 欧美噜噜久久久xxx| 国产精品久久久久av免费| 国产精品乱码妇女bbbb| 国产在线播放一区二区三区| 国产亚洲精品久| 亚洲福利精品| 在线亚洲自拍| 久久电影一区| 欧美国产精品久久| 洋洋av久久久久久久一区| 亚洲欧美日韩一区二区| 久久久久久999| 欧美精品一区二区久久婷婷| 欧美日韩精品在线观看| 国产视频一区二区三区在线观看| 在线欧美亚洲| 亚洲一区二区av电影| 美国十次了思思久久精品导航| 亚洲国产第一页| 亚洲欧美国产制服动漫| 久久综合九色九九| 国产精品卡一卡二卡三| 亚洲福利在线观看| 亚洲自拍电影| 欧美国产日产韩国视频| 亚洲欧美电影在线观看| 欧美大片在线看免费观看| 国产日韩精品一区二区| 一本色道久久综合一区 | 99v久久综合狠狠综合久久| 亚洲一区影音先锋| 欧美成年人网站| 亚洲男人av电影| 欧美福利视频在线观看| 国产一区二区三区四区| 亚洲午夜久久久久久尤物 | 久久久国产午夜精品| 亚洲精品美女| 久久五月天婷婷| 国产亚洲二区|