B1089 狼人殺 簡單版

2022-07-20 00:57:11 字數 2224 閱讀 4173

題目連線:

以下文字摘自《靈機一動·好玩的數學》:「狼人殺」遊戲分為狼人、好人兩大陣營。在一局「狼人殺」遊戲中,1 號玩家說:「2 號是狼人」,2 號玩家說:「3 號是好人」,3 號玩家說:「4 號是狼人」,4 號玩家說:「5 號是好人」,5 號玩家說:「4 號是好人」。已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。扮演狼人角色的是哪兩號玩家?

本題是這個問題的公升級版:已知 n 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。要求你找出扮演狼人角色的是哪幾號玩家?

輸入在第一行中給出乙個正整數 n(5)。隨後 n 行,第 i 行給出第 i 號玩家說的話(1),即乙個玩家編號,用正號表示好人,負號表示狼人。

如果有解,在一行中按遞增順序輸出 2 個狼人的編號,其間以空格分隔,行首尾不得有多餘空格。如果解不唯一,則輸出最小序列解 —— 即對於兩個序列 [ 和 [,若存在 0 使得 [ (i≤k),且 [,則稱序列 a 小於序列 b。若無解則輸出no solution

5

-2+3

-4+5

+4

1 4

6

+6+3

+1-5

-2+4

1 5

5

-2-3

-4-5

-1

no solution

#include #include 

#include

using

namespace

std;

intmain()

for(int i=1; i)

}if(lie.size()==2 && ans[lie[0]]+ans[lie[1]]==0

) }

}cout

<<"

no solution

"

}

主要思路是:窮舉法。首先將每個人說的話(輸入的資訊)記錄在vi向量中,並假設i、i+1(i從1開始)均是狼人,那麼其餘人都是好人(分別用-1和1表示),儲存在ans向量中。之後檢驗一下假設的情況與實際情況是否相符合且是否滿足題幹:乙個狼人乙個好人說謊,由於i本來就是按序號從小到大遍歷,因此得到滿足條件的情況就可以輸出之並結束程式。

記錄本題是想反思一下做題思路的問題。首先看到這題時,我是比較蒙的,感覺無從下手。我按著固有的分析方式進行如下假設:

輸入:

5

-2+3

-4+5

+4

對應著便是:

編號: 123

45話: -2 +3 -4 +5 +4

那麼1、3兩個編號的人必須有乙個人說謊了,且有乙個人必定是狼人。於是就可以分為  編號1說謊且是狼人,   編號1說謊且是好人,   編號3說謊且是狼人,   編號3說謊且是好人    四種情況。然後在基於該條件下,進行進一遍推理,直到推出矛盾的結果。思路真的很奇怪,我也不知道為什麼一看見這題,會這樣思考,也許是慌不擇路了。然而按著這種思路寫程式是根本寫不出的,思路太混亂太複雜了。

看了別人部落格的分析後,豁然明白了乙個道理:人的智慧型在於思維,可以對問題進行推理,在進行少量嘗試後得到答案;而程式的智慧型在於計算,可以短時間內計算完所有有限數量的結果,但判斷的邏輯不能太複雜。這也啟示,在時間複雜度允許的情況下,那麼可以窮舉各種情況進行簡單判斷,而不是設定多種條件來過濾答案。

此外,還有值得學習的乙個方面,是vector這個向量容器的使用,具體可以參看大佬的部落格:

這裡,我想提示一下,若程式如下這樣寫可能某些情況下查不出錯誤,但是放在oj上執行時會提示「執行時錯誤」。

vector lie, vi(n+1);  //

宣告乙個初始大小為n+1的向量

cin>>n;

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

寫程式時,不小心犯了這種低階錯誤:先宣告了向量vi,然後再輸入n的值。在執行題幹第乙個測試用例時,正常出結果;然而執行第二個測試用例時,沒有任何輸出直接結束了。在oj上執行,測試用例1和3顯示「執行超時」。

正確的寫法應該是將第二行寫在第一行前面。

1089 狼人殺 簡單版

1.解題思路 每個人說的數字儲存在v陣列中,i從1 n j從i 1 n遍歷,分別假設i和j是狼人 a陣列表示該人是狼人還是好人,等於1表示是好人,等於 1表示是狼人。k從1 n分別判斷k所說的話是真是假,k說的話和真實情況不同 即v k a abs v k 0 則表示k在說謊,則將k放在lie陣列中...

1089 狼人殺 簡單版

以下文字摘自 靈機一動 好玩的數學 狼人殺 遊戲分為狼人 好人兩大陣營。在一局 狼人殺 遊戲中,1 號玩家說 2 號是狼人 2 號玩家說 3 號是好人 3 號玩家說 4 號是狼人 4 號玩家說 5 號是好人 5 號玩家說 4 號是好人 已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實...

1089 狼人殺 簡單版

以下文字摘自 靈機一動 好玩的數學 狼人殺 遊戲分為狼人 好人兩大陣營。在一局 狼人殺 遊戲中,1 號玩家說 2 號是狼人 2 號玩家說 3 號是好人 3 號玩家說 4 號是狼人 4 號玩家說 5 號是好人 5 號玩家說 4 號是好人 已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實...