CSP認證2019 03 的第四題

2021-09-23 10:54:04 字數 1723 閱讀 4982

訊息傳遞視窗

最近在刷csp認證2023年三月份的第四題,主體思路是開n個佇列,分別去維護n個程序,之前的想法是直接暴力,去判斷這n個佇列的隊首元素是否匹配,本以為沒有問題。但是出現了玄學錯誤,官網測試上報的是超時。

經後面發現是讀入掛了。附上原來的讀入程式

cin >> t >> n;

getchar();

while (t--)

int flag = 0, o = 0;

for (int i = 0; i <= 10005; i++) fill(vis[i],vis[i] + 10,0);

for (int i = 0; i < n; i++) while (getchar()!='\n')

}

在本地執行是正確的,不懂掛在**。

下面附上改進版的讀入程式

思路也改進了,之前暴力會t,後面採用了廣搜。

具體思想:初始化:取n個佇列的隊首元素入廣搜佇列。

然後取出廣搜佇列裡的隊首元素,判斷其與其他n個程序佇列裡的隊首元素是否匹配,若匹配,則相應程序的兩個佇列的隊首元素均出隊,並且需要打上標記。

(沒聽懂沒關係,下面用例子說明)

注意不管匹配不匹配,廣搜佇列裡的隊首元素都會出佇列。

例:t = 1,n = 2

s1 r0

r0 s1

初始化:廣搜佇列裡有

s1r0

取出廣搜佇列裡的隊首元素:s1,發現與程序1裡的r0相匹配,因此將廣搜佇列裡的r0打上標記,下次遍歷到它時,直接跳過;並且將s1,r0分別從原來的程序佇列裡pop出去,此時應將r0和s1入佇列。需要注意的是將程式從程序佇列裡pop出去時,若程序佇列非空的話,需要將程序佇列新的隊首元素重新入廣搜佇列。

打上標記的做法用乙個vis[a][b]//a表示第幾個程序,b表示在程序裡的位置

s1(vis[0][0]) r0(vis[0][1])

r0(vis[1][0]) s1(vis[1][1])

但是最終只得了90分,不知道**出錯了。

希望能幫助到大家。

#include using namespace std;

struct data ;

queueq[10005];//每個佇列維護相應的程序

queuemq;

int vis[10005][10];

char str[20];

int main()

int flag = 0, o = 0;

for (int i = 0; i <= 10005; i++) fill(vis[i],vis[i] + 10,0);

for (int i = 0; i < n; i++)

tmp.belong = i;

tmp.num = ans;

tmp.pos = o++;

ans = 0;

number = 0;

q[i].push(tmp);}}

}for (int i = 0; i < n; i++)

while (!mq.empty())

} for (int i = 0; i < n; i++)

if (flag == n) printf("0\n");//無死鎖

else printf("1\n");//有死鎖

} return 0;

}

CSP認證刷題歷程 201803 1

python 試題名稱 跳一跳 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。簡化後的跳一跳規則如下 玩家每次從當前方塊跳到下乙個方塊,如果沒有跳到下乙個方塊上則遊戲結束。如果跳到了方塊上,但沒有跳到方塊的中心則獲得1分 跳到...

CSP認證刷題歷程 201712 1

python 試題名稱 最小差值 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個數,請找出其中相差 差的絕對值 最小的兩個數,輸出它們的差值的絕對值。輸入格式 輸入第一行包含乙個整數n。第二行包含n個正整數,相鄰整數之間使用乙個空格分隔。輸出格式 輸出乙個整數,表示答案...

CSP認證真題 201909 1 小明種蘋果

備考csp認證c 第一天,東西忘得差不多了,這道題主要是作為第一道是難度最低的,主要是一維陣列 二維陣列的四則以及最值比較,之前用min element 函式進行陣列操作,雖然兩個樣例的輸出都滿足預期但是,系統判定為運算錯誤只能拿到70分,轉而用這種基礎的解決方法。主要思路 第乙個問題 求剩餘蘋果總...