剛學oi的時候覺得難得要死。現在看……
因為我們不知道誰是罪犯和今天是星期幾,所以我們全都列舉一下,然後判定答案。
這樣思路是不是就很顯然了?
先處理下證詞那些字串。然後對每個答案進行判定。判定出說謊人數不符合或又說真話又說假話等情況,就直接判false。
然後對於每乙個人,只需要有一天滿足是**,就說明這個人是**。
所以思路講到這裡就完了。
接下來是最難的實現環節:
首先面對的是所有的證詞。應該認識到有的人會划水,有的人會提供有用的資訊。
划水的方式有很多種:
說些什麼i ak ioi.
說些什麼i love you.
說些什麼i am guity.
說些什麼i am not guilty. am i?????
說些什麼today is christmas-day.
甚至還有人的名字叫做i
。所以還需要區分i is guilty.
和i am guilty.
。
這裡最好用std::stringstream
讀一整行,並且可以用ss >> str
的返回值來判斷是否後面已經沒有字元可讀。
說到底就是細心點實現了吧。
然後面對的是判定部分。
注意到每個人,最初都無法判斷,根據一些話可以判斷是說謊還是不說謊。
同樣,每個人從一而終,如果又說謊又誠實就return false。
並且,那些無法判斷的人,是可以認為說謊,也可以認為不說謊的。即我們最後求出的說謊人數是個區間來的。如果最後人數滿足區間就可以return true了。
下資料調這種模擬的**是很鍛鍊碼力的,做這道題的時候一定會經歷到的。
**:
#includeusing std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
const int maxn = 25, maxm = 105;
int m, n, p;
string name[maxn];
std::mapmmp;
std::vector> proof[maxn];
int fake[maxn];
bool check(int who, int now) else
} else if(it.first == 2) else
} else if(it.first == 3) else
} else if(it.first == 4) else
} else if(it.first == 5) else }}
}int cnt = 0, help = 0;
for(int i = 1; i <= m; i++)
//cout << cnt << ' ' << help << endl;
if(cnt <= n && n <= cnt + help) return true;
return false;
}void solve()
if(flag)
}if(cnt == 1) else if(cnt == 0) else
}void init()
mmp["sunday"] = 0;
mmp["monday"] = -1; mmp["tuesday"] = -2;
mmp["wednesday"] = -3; mmp["thursday"] = -4;
mmp["friday"] = -5; mmp["saturday"] = -6;
getline(cin, temp);
for(int i = 1; i <= p; i++) else if(temp == "not") else continue;
} else if(temp == "is") else if(temp == "not") else continue;
} else continue;
} else if(temp == "today")
proof[idx].push_back(std::make_pair(5, id));
//cout << 5 << ' ' << id << endl;
} else
proof[idx].push_back(std::make_pair(3, id));
//cout << 3 << ' ' << id << endl;
} else if(temp == "not")
proof[idx].push_back(std::make_pair(4, id));
//cout << 4 << ' ' << id << endl;}}
}}int main()
P1039 偵探推理
include include include using namespace std int n,m,p,fake 21 err,w 200 nx string name 100 say 200 string day 10 void set int who,int yx intmain for i...
P1039 偵探推理
include include include using namespace std int n,m,p,fake 21 err,w 200 nx string name 100 say 200 string day 10 void set int who,int yx intmain for i...
洛谷 P1039 偵探推理
題目描述 明明同學最近迷上了偵探漫畫 柯南 並沉醉於推理遊戲之中,於是他召集了一群同學玩推理遊戲。遊戲的內容是這樣的,明明的同學們先商量好由其中的乙個人充當罪犯 在明明不知情的情況下 明明的任務就是找出這個罪犯。接著,明明逐個詢問每乙個同學,被詢問者可能會說 證詞中出現的其他話,都不列入邏輯推理的內...