算法訓練 審美課 python

題目鏈接

問題描述
  《審美的歷程》課上有n位學生,帥老師展示了m幅畫,其中有些是梵高的作品,另外的都出自五歲小朋友之手。老師請同學們分辨哪些畫的作者是梵高,但是老師自己並沒有答案,因爲這些畫看上去都像是小朋友畫的……老師只想知道,有多少對同學給出的答案完全相反,這樣他就可以用這個數據去揭穿披着皇帝新衣的抽象藝術了(支持帥老師_)。
  答案完全相反是指對每一幅畫的判斷都相反。

分析:0,1相反異或^即可。
思路:用二進制表示每位同學的回答(狀壓)。(m<=20;2^20 在int的範圍內)。相反的答案用二進制與m個1,1,1…1(即2^m-1)的數maxn取異或即可。(如 01 == 1 ,10 == 2,2^3 == 1(異或),1^3 == 2 )。

n, m = map(int, input().split())
d = {}
for i in range(n):
    num = 0
    x = input().split()
    for j in x:
        num = (num << 1) + int(j)
    d[num] = d.get(num, 0) + 1
ans = 0
max = (1 << m) - 1
mid = max // 2
for i in d:
    if mid < i:
        continue
    ans += d[i] * d.get(max ^ i, 0)
print(ans)

樣例輸入

3 2
1 0
0 1
1 0

樣例輸出

2

樣例說明

同學1和同學2的答案完全相反;
  同學2和同學3的答案完全相反;
  所以答案是2。

數據規模和約定

對於50%的數據:n<=1000;
  對於80%的數據:n<=10000;
  對於100%的數據:n<=50000,m<=20。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章