思路
這道題考察set的用法泞边,直接使用set的find比用map標(biāo)記的find更好,不會(huì)超時(shí)。
set的幾個(gè)關(guān)鍵用法小結(jié):
set的定義: set<typename> name;
set的特點(diǎn):set內(nèi)元素自動(dòng)遞增排序,且去重
set內(nèi)元素的訪問只能通過迭代器雄家,而不能是下標(biāo):set<typename>:: iterator it
,遍歷元素時(shí)胀滚,不能使用 < set.end() 而要寫 != set.end()
set常用函數(shù):
insert()
時(shí)間復(fù)雜度是對(duì)數(shù)級(jí)別
find()
時(shí)間復(fù)雜度 對(duì)數(shù)級(jí)別
erase()
刪除指定元素(value)趟济,刪除指定位置元素(迭代器), 刪除區(qū)間元素(first, last)
代碼
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
set<int> s[maxn];
int main() {
int n;
cin>>n;
for (int i = 1; i <= n; i++) {
int len;
cin>>len;
for (int j = 0; j < len; j++) {
int number;
cin>>number;
s[i].insert(number);
}
}
int q;
cin>>q;
while (q--) {
int q1, q2;
cin>>q1>>q2;
double nc = 0, ns = s[q1].size();
for (auto it = s[q2].begin(); it != s[q2].end(); it++) {
if (s[q1].find(*it) == s[q1].end()) ns++;
else nc++;
}
double sim = nc / ns * 100;
printf("%.1f%\n", sim);
}
}