这题我刚开始n,m一起输入的,结果还过了11个样例, 找半天错误,从哈希换到离散化,结果后面改个输入都对了。
离散化
1.将科学家会的语言离散化,映射到cnt数组中。
2.记录下电影的语音采用的语言里 科学家会的语言最多的电影。
3.在上面的电影中再找 科学家会的语言最多的电影。
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int> docter, add; //docter 离散化数组
int cnt[200020]; // cnt[语言] = 科学家的人数
int find(int x)
{
int l = 0, r = docter.size() - 1;
while(l<r)
{
int mid = l + r >> 1;
if(docter[mid] >= x) r = mid;
else l = mid + 1;
}
if(x == docter[l])return l; //需要判断没找到的情况
return docter.size();
}
int main()
{
int n,m;
cin >> n;
for(int i=0;i<n;i++)
{
int x;
cin >> x;
docter.push_back(x);
add.push_back(x);
}
sort(docter.begin(), docter.end()); //离散化
docter.erase(unique(docter.begin(), docter.end()), docter.end());
for(int i=0; i<n;i++) //映射到每门语言会的科学家的数量
cnt[find(add[i])] ++;
cin >> m; //m要在这里输入!!!!!!!
vector<int> movie; //语音的最优解 的电影
int peo=0;
for(int i=0;i<m;i++)
{
int x;
cin >> x;
int t = find(x);
if(cnt[t] > peo)
{
movie.clear();
movie.push_back(i);
peo = cnt[t];
}
else if(cnt[t] == peo)
movie.push_back(i);
}
int ans = -1;
peo = 0;
for(int i=0, j =0; i<m; i++)
{
int x;
cin >> x;
int t = find(x);
if(j < movie.size() && movie[j] == i)
{
if(ans == -1 || cnt[t] > peo)
ans = i, peo = cnt[t];
j++;
}
}
cout << ans + 1<< endl;
}
哈希
不想去回想了,随便看看把。
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int N = 400003;
int n,m;
int a[N], d[N], cnt[N]; // cnt 这门语言有多少科学家会, a 哈希 -> 语言
vector<int> b,c;
int find(int x) // 语言 -> 下标
{
int t = x%N;
while(a[t] != -1 && a[t] != x)
{
t ++ ;
if(t ==N) t = 0;
}
return t;
}
int main()
{
memset(a,-1,sizeof a);
int x;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> x;
int k = find(x);
a[k] = x;
cnt[k] ++;
}
cin >> m;
int y = 0,ans = 0;
for(int i=1;i<=m;i++)
{
cin >> d[i];
int k =find(d[i]);
if(cnt[k] > y)
{
y = cnt[k];
b.clear();
b.push_back(i);
}
else if(cnt[k] ==y) b.push_back(i);
}
y = 0;
for(int i=1, j =0;i<=m;i++)
{
cin >> x;
if(j < b.size() && i == b[j])
{
int k = find(x);
if(cnt[k] >= y)
{
ans = i;
y = cnt[k];
}
j ++;
}
}
cout << ans << endl;
}