电影
题目来源:算法竞赛进阶指南
题目标签:离散化
题目链接:https://www.acwing.com/problem/content/105/
方法一:使用map和结构体,先找到语音序列中最大的电影,再在里面找到字幕序列中最大的电影
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #define N 200010 using namespace std; map<int,int>s; int a[N]; int b[N]; struct zz { int a; int b; }p[N]; int main() { int n,m,i,j,k; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); //s用来统计a[i]的个数 s[a[i]]++; } scanf("%d",&m); for(i=1;i<=m;i++) scanf("%d",&p[i].a); for(i=1;i<=m;i++) scanf("%d",&p[i].b); int mm=0;k=1; for(i=1;i<=m;i++) { //统计出现次数最多的语言的个数,并记录其在语音列表中---第一次出现-----的位置 if(mm<s[p[i].a]) { mm=s[p[i].a]; k=i; } } //统计 int kk=0; for(i=1;i<=m;i++) { //在mm相等的情况下,比较s[p[i].b]。记录s[p[i].b]最大的位置 if(s[p[i].a]==mm) { if(kk<s[p[i].b]) { kk=s[p[i].b]; k=i; } } } printf("%d\n",k); return 0; }
方法二:离散化+二分查找
#include<bits/stdc++.h> #include<iostream> #define INF 0x3f3f3f3f using namespace std; const int maxn=2e5+5; int n,m; int a[maxn],b[maxn],c[maxn]; int sum[maxn*3]; int cnt,mm; int arr[maxn*3],num[maxn*3]; void discrete(){//离散化 sort(arr+1,arr+cnt+1); for(int i=1;i<=cnt;i++){ if(i==1||arr[i]!=arr[i-1]) num[++mm]=arr[i]; } } int query(int x){//二分查找x的位置 return lower_bound(num+1,num+mm+1,x)-num; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){//将所有电影和人涉及的语言放进一个数组,排序并离散化 scanf("%d",&a[i]); arr[++cnt]=a[i]; } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d",&b[i]); arr[++cnt]=b[i]; } for(int i=1;i<=m;i++){ scanf("%d",&c[i]); arr[++cnt]=c[i]; } discrete();//离散化 //离散化以后,将所有的语言的坑都填起来 for(int i=1;i<=n;i++){ int id=query(a[i]);//统计每种语言的人的数量 //sum数组类似于map使用,统计n序列中数字的出现个数 //所以这样看来,还不如直接用map,不用扯什么排序和离散化 ++sum[id]; } int bmax=-1,cmax=-1,ans=0; for(int i=1;i<=m;i++){ //选择满足题目要求的电影 int x=query(b[i]); int y=query(c[i]); if(sum[x]>bmax){ //优先考虑让很高兴的人最多 bmax=sum[x],cmax=sum[y]; ans=i; }else { //否则if是在相等的情况下,则我们可以 if(sum[x]==bmax&&sum[y]>cmax){ //如果答案不唯一、则在此前提下再让比较高兴的人最多 bmax=sum[x],cmax=sum[y]; ans=i; } } } printf("%d\n",ans); return 0; }

浙公网安备 33010602011771号