訊息傳遞視窗
最近在刷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分,轉而用這種基礎的解決方法。主要思路 第乙個問題 求剩餘蘋果總...