演算法訓練 審美課

2021-09-11 07:55:26 字數 1888 閱讀 1327

時間限制:1.0s 記憶體限制:256.0mb

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

答案完全相反是指對每一幅畫的判斷都相反。

第一行兩個數n和m,表示學生數和圖畫數;

接下來是乙個n*m的01矩陣a:

如果aij=0,表示學生i覺得第j幅畫是小朋友畫的;

如果aij=1,表示學生i覺得第j幅畫是梵谷畫的。

輸出乙個數ans:表示有多少對同學的答案完全相反。

3 21 0

0 11 0

同學1和同學2的答案完全相反;

同學2和同學3的答案完全相反;

所以答案是2。

對於50%的資料:n<=1000;

對於80%的資料:n<=10000;

對於100%的資料:n<=50000,m<=20。

我的**

#include

#include

#include

int n,m,ans=0;

//n和m,表示學生數和圖畫數

using namespace std;

int main ()}

for(

int i=

1;i(temp) ans++

;else temp=true;}}

printf

("%d"

,ans)

;return0;

}

這是我自己做的,想法就是通過位運算避免超時,但是不知道為什麼就是通不過,我也很無奈,智慧型分析一下大神的**了。

大神**1

#include

using namespace std;

intmain()

;for

(int i=

0;i)for

(int j=

0;j)for

(int i=

0;i)for

(int k=i+

1;k(sum[i]

+sum[k]

==m)

//有可能相反

for(

int j=

0;jcout

}

這個大神的**只得了80分,但是也比我的強多了,思路就是,兩個完全相反的人,相加肯定等於m。

大神**2

#include

using namespace std;

int m,n,a[

50005];

int ans[

2000000]=

;int sum =0;

intmain()

ans[a[i]]++

;//獲得每個答案的人數

}int max =(1

<;for

(int i=

0;i) cout<2

}

用二進位制儲存的思路如下:

1.將每個學生的答案用陣列a[i]以二進位制的形式儲存。故答案相同的學生陣列a[i]存的值是相同的。

2.陣列ans[ a[i] ]用於儲存每種答案的人數。例如,假設ans[3]=10,即有10個人答案相同且答案都為3 (十進位制3對應的二進位制為011)。

3.按行遍歷,按位取反,與取反後的答案相同的 即為題目要求的完全相反的答案。

4.最後sum/2是因為重複計算了,除以2之後才是「有多少對同學」。

這個**,思路我大概看懂了,也是用位運算,但是max = (1<

演算法訓練 審美課

問題描述 審美的歷程 課上有n位學生,帥老師展示了m幅畫,其中有些是梵谷的作品,另外的都出自五歲小朋友之手。老師請同學們分辨哪些畫的作者是梵谷,但是老師自己並沒有答案,因為這些畫看上去都像是小朋友畫的 老師只想知道,有多少對同學給出的答案完全相反,這樣他就可以用這個資料去揭穿披著皇帝新衣的抽象藝術了...

演算法訓練 審美課

問題描述 審美的歷程 課上有n位學生,帥老師展示了m幅畫,其中有些是梵谷的作品,另外的都出自五歲小朋友之手。老師請同學們分辨哪些畫的作者是梵谷,但是老師自己並沒有答案,因為這些畫看上去都像是小朋友畫的 老師只想知道,有多少對同學給出的答案完全相反,這樣他就可以用這個資料去揭穿披著皇帝新衣的抽象藝術了...

演算法訓練 審美課

題目描述 給定n個含m個0 1的數字出串,判斷其中按位與為0的對數。注意點 使用string中 運算時,耗費時間非常巨大 第乙個 ac,第二個差乙個資料點,超時 改了很多地方,最後結果就是出在 號上。include include include include include include in...