題目連線:
以下文字摘自《靈機一動·好玩的數學》:「狼人殺」遊戲分為狼人、好人兩大陣營。在一局「狼人殺」遊戲中,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
對應著便是:
編號: 12345話: -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 人說的不是實...