#41450: 解題邏輯


h9512218@gmail.com (賴譽毫)

學校 : 國立臺灣師範大學
編號 : 108800
來源 : [111.250.233.167]
最後登入時間 :
2024-07-28 09:18:30
c093. 00608 - Counterfeit Dollar -- UVa608 | From: [111.250.234.47] | 發表日期 : 2024-07-27 20:22

採用3維vecot

第一維 3筆輸入

第二維 天平左右側

第三維 紀錄使用到的硬幣

vector<vector<vector<bool>>> input(3,vector<vector<bool>>(2,vector<bool>(12)));
天平兩端的關係,則在用一個一維陣列存好,以便後續使用
再建立一個bool ans[12]={0} 代表可能答案的候選點 ,邊讀字串時,減去'A'得到對應的index值設1
不知道測資左右兩側會不會有重複,建議可以讀取完後,再前處理,兩側皆為1的index轉乘0
 
再來採用布林邏輯,進行刪去法
輸入處理好後,天平有三種情況
even,這比較點單,代表兩側皆不是答案,先將各兩側取not,再分別與ans取and,排除不合理的答案
再來是up、down,這需要兩兩比較
兩次測量都是up或down,以 a、b表示兩次測量,表示偽幣不是在a、b的左側,就是在a、b的右側,因此先(a左 and b左 )or (a右 and b右),再跟ans取and,排除不合理的答案
一筆up,另一筆down,表示偽幣在a、b處理相對的兩側,因此先(a左 and b右 )or (a右 and b左),再跟ans取and,排除不合理的答案
 
為什麼兩次測量都是up或down,偽幣會同一側,這是因為,根據等量公理,兩側排除等重的後,最後剩下一偽幣、一真幣,如果不是同一側,勢必會有一大一小,不同都偏向同一側,同理可知一筆up,另一筆down。
 
找出偽幣後,再去up或down的資料看偽幣位於哪一側,就知道答案了。
 
ZeroJudge Forum