特殊消消看(game) 一道鍊錶好題

2021-08-21 10:37:24 字數 2038 閱讀 6988

這道題是lzw神犇自己出的一道原創好題,一開始我想到了正確解法,就是細節上沒有處理好,初測只有10分,wa了9個點。

n個珠子排成一排,每個珠子有乙個顏色,用小寫字母a…z表示。對於某個珠子,如果存在乙個和它相鄰並且顏色不同的珠子,那麼稱它是特殊的。每回合會消去所有特殊的珠子。問多少回合後不能再消。

第一行n。第二行乙個a…z的字串,表示珠子的顏色。

一行,答案。

樣例一:

game.in

4 aabb

game.out

2 樣例二:

game.in

6 aabcaa

game.out

1對於樣例一的兩個回合:aabb->ab->null

對於樣例二的乙個回合:aabcaa->aa

50%的資料n<=10^3

100%的資料n<=10^6

這道題o(n^2)的暴力很好想,就是模擬去刪點,這裡就不贅述了。正解是用鍊錶做的。我們可以把所有點分成乙個個塊,塊內所有點的顏色相同,相鄰的塊顏色不同。因為要快速刪塊,所以考慮使用鍊錶。我們可以用node型別儲存每個塊的顏色和點數,並構建乙個鍊錶。每次把頭和尾的塊點數-1,中間的點數-2。做的時候可能有些塊會被減光,就要把它前面沒被減光的塊和它後面沒有減光的塊連一條鏈,如果顏色相同則需要合併。至於複雜度,每個點都要被刪一次,所以是o(n)的。

好久沒寫過鍊錶了,有好多細節處理得還不大好,所以初測只有10分。附上我10分**。

#include

#include

using namespace std;

struct node

;int n,ans;

string s;

int main()

while (h!=null&&h->next!=null)

else

}q=p;

p=p->next;

}if (p!=h)

}if (h->count==0)

ans++;

// p=h;

// while (p->next!=null)

//

// cout<<' '}

cout《看出來**錯了嗎?我一開始很自信自己是對的,直到我看到分數。當乙個塊被減光時,我是直接把它前乙個塊和後乙個塊連起來,卻沒***前後的塊都沒被減光,於是塊就會比實際要多,然後就錯了。我還是對著資料分析了半天才發現的。

不說了,還是欣賞一下我的ac**吧。

#include

#include

using namespace std;

struct node

;int n,ans;

string s;

int main()

//以上是建立鍊錶的過程

while (h!=null&&h->next!=null)//當鍊表中什麼都沒有了或者只剩下一塊的時候就做完了

if (q->data!=p->data)//如果這一塊沒被減光,就把上乙個沒被減光的next指向這一塊

else q->count+=p->count;//如果這兩塊的data一樣,就可以合併

p=p->next;

}//頭部和中間都處理完了,接下來要處理尾部

if (q->data==p->data)//尾部的合併

else q->next=p;//跳過中間一些被減光的塊

if (p!=h)//如果尾和頭不是同乙個塊就-1

}if (h->count<=0)//頭部沒了的操作放後面會方便一點,起碼能保證後面要麼都沒了,要麼就是沒被減光的塊

ans++;

//以下是遍歷整個鍊錶的操作,可以把每一塊輸出來

// p=h;

// while (p!=null&&p->next!=null)

//

// if (p!=null) cout<<' '}

cout《像這種細節很多的題,思路一定要清晰,考慮多種情況,自己要多測幾組資料,並把中間過程多輸出一點,這樣才能發現一些錯誤。

一道搜尋好題

這個題真的叫這個名字 一道搜尋好題 我也很絕望 但是這並不是好題推薦 題目描述 給定乙個數s,找任意個正整數a1,a2,an,使得它們的和恰好等於s,且它們的倒數之和與1的差不超過10 6。輸出任意一種方案或者輸出無解。s 65536 輸入樣例 10輸出樣例 2 4 4 看起來非常的不靠譜對不對 實...

一道搜尋好題

給定乙個數s,找任意個正整數a1,a2,an,使得它們的和恰好等於s,且它們的倒數之和與1的差不超過10 6。輸出任意一種方案或者輸出無解。s 65536 解析 事實上也是簡單的搜尋。從小到大列舉每個數,加入試試看。兩個剪枝 當前的和加上最大的和到不了1,退出。當前的和加上最小的和都超過了1,退出。...

一道題看水平

題目 四個正整數abcd,均小於10000。寫乙個函式實現d等於a的b次方與c取餘。一 int function int a,int b,int c return s 二 unsigned int fact unsigned int a,unsigned int b,unsigned int c r...