離散化的方法大致有兩種:
利用c++中的stl;
直接利用陣列來儲存離散化後的資料
本題我們採用第二種。
先分析一下題目大意:
n位科學家去看電影,電影院上映了m部電影,每個科學家只會一種語言,先輸入科學家的人數n(可能有多個科學家懂同一種語言),在輸入科學家懂的語言,輸入電影院上映的電影數量m,接下來的一行輸入電影的音訊語言(b[i]),下一行輸入電影的字幕語言(c[i]),注意:b[i]和c[i]是同一部語言的音訊語言和字幕語言,且b[i] != c[i],如果乙個科學家能聽懂音訊語言那麼這個科學家會非常開心,如果該科學家能看懂字幕語言,那麼這個科學家會比較開心。現在請你為科學家們挑選一部電影,使得:非常開心(能聽懂音訊語言)的科學家的人數最多,如果有多部電影同時滿足此要求則在此基礎上挑選一部電影讓比較開心(能看懂字幕語言)的人數最多,最後輸出這部電影的編號(編號從1開始)
再來看一下資料範圍:
1 <= n,m <= 2e5我們來簡單的提一下離散化:1 <= ai,bi,ci <= 1e9
而1e9 遠遠大於 2e5,因此考慮離散化
離散化的本質是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。
對映的操作方法:將不連續的點對映到連續的陣列下標,即開闢額外的陣列存放原來陣列的下標。
而排序之後的下標就是對映的值。離散化對映的本質是查詢下標。
下面咱來看ac**(詳細解釋都放在**裡了):
//1.輸入科學教會的語言,音訊語言,字幕語言,並將所有語言儲存於數
// 組lang中
//2.將陣列lang排序並去重儲存於陣列uni中
//3.定義函式用於在陣列uni中查詢元素
//4.定義陣列ans用於儲存每種語言科學家懂的人數,且ans的下標與uni數
// 組的下標相同
//5.遍歷m部電影,找到能聽懂某種語言的人數,在此基礎上找出能看懂字幕的
// 最多人數
#include
#include
using
namespace std;
int n,m,k =
1,tot =1;
const
int n =
2e5+50;
int a[n]
,b[n]
,c[n]
;int lang[
3*n]
,uni[
3*n]
,ans[
3*n]
;//a[j]表示第j個科學家會的語言,uni[i]表示每種不同語言的編號(科學家會的、字幕語言、音訊語言),
//ans[i]記錄了a[j]這門語言有多少個科學家會
intfind
(int x)
//根據乙個值在uni中查詢該值對應的下標
void
store
(int arr,
int len)
}int
main()
//遍歷每乙個a[i],查詢a[i]的值在uni陣列中的下標,並
//把這個下標作為ans的下標儲存
//這樣一來每種語言對應的下標在ans和uni中是一樣的
for(
int i =
1; i <= n; i++
) ans[
find
(a[i])]
++;//ans[i]記錄了a[j]這門語言有多少個科學家會
//遍歷所有電影,按要求找到符合題意的電影
int res,ans1,ans2;
//res預設為1,防止1是最佳值的情況
res =1;
// ans1 = ans2 =0;
//二者儲存的是開心或比較開心的人數
//算出第i個電影懂音訊語言的科學家數和懂字幕語言的科學家數
for(
int i =
1; i <= m; i++
)//並不是單純的遍歷陣列b或陣列c,而是遍歷每乙個編號對應的電影(一共m部電影)
cout << res << endl;
return0;
}
有問題您就來問我,別偷偷藏在心裡。
關注科學家
關注科學家是如何做到工作,家庭兩不誤的 關注錢學森 王選 摘自 王選主要著述 軟體設計方法 1992年4月清華大學出版社出版 王選文集 1997年2月北京大學出版社出版 王選談資訊產業 1999年3月北京大學出版社出版 錢老 錢學森 的書 摘自 工程控制論 物理力學講義 星際航行概論 論系統工程 關...
離散化 電影
n 個科學家每個科學家只懂得一門語言,所有語言用 1 sim 10 的數字進行標號,m 部電影,每部電影的語音和字幕採用不同的兩種語言,所有科學家看同一部電影,如果乙個科學家能聽懂語音很開心,看懂字幕比較開心,都不懂不開心 選擇一部電影,很開心的人數最多,很開心的人數相同時比較開心的盡量多 begi...
小蟲 我更像個科學家
小蟲 我更像個科學家 出 是為了掙錢辦學校 1985年出道初期,小蟲曾經發行過一張 我不是壞小孩 當時銷量達到20多萬張。去年,小蟲決定從自己25年創作生涯中挑選一些代表作品,按照 東方 西方 南方 北方 的不同風格推出4張唱片,與世無爭 便是這個系列裡的第一張,這張比較中國風,我現在正在錄製 西方...