题目
H - Horror Film Night
题意:两个人一起电影,每天看一部,输入第一行为n,a1,a2……an;为第一个人喜欢看的电影总数n,其后是喜欢看的电影的编号。输入第二行为m,b1,b2……bn;为第二个人喜欢看的电影总数m,其后是喜欢看的电影的编号。
两个人只能看两个人都喜欢的电影或者其中一人喜欢另一个人不喜欢的电影,且不能连续看一个人单独喜欢的电影,求出能看电影的最大数目。
思路:vis[i]代表第i天喜欢看电影的情况,vis[i]=0代表两个人都不喜欢,vis[i]=1代表第一个人喜欢,vis[i]=2代表第二个人喜欢,vis[i]=3代表两个人都喜欢。cur代表之前看电影的情况与vis[i]结合,具体情况具体分析。
AC代码
1
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int b[1000010];
int vis[1000010];
int main()
{
int n,m;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
vis[a[i]]+=1;
}
cin>>m;
for(int i=0; i<m; i++)
{
cin>>b[i];
vis[b[i]]+=2;
}
sort(a,a+n);
sort(b,b+m);
int ans=0;
int cur=0;
int maxx=max(a[n-1],b[m-1]);
for(int i=0; i<=maxx; i++)
{
if(vis[i]==0)
{
// cur=0;//错误的,为0;
continue;
}
else if(vis[i]==1)
{
if(cur==0||cur==2||cur==3)
{
ans++;
cur=1;
}
else if(cur==1)
{
cur=1;
continue;
}
}
else if(vis[i]==2)
{
if(cur==0||cur==1||cur==3)
{
ans++;
cur=2;
}
else if(cur==2)
{
cur=2;
continue;
}
}
else if(vis[i]==3)
{
ans++;
cur=3;
}
}
cout<<ans<<endl;
return 0;
}
2
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int b[1000010];
map<int,int>a1;
map<int,int>b1;
int main()
{
int n,m;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
a1[a[i]]++;
}
sort(a,a+n);
cin>>m;
for(int i=0; i<m; i++)
{
cin>>b[i];
b1[b[i]]++;
}
sort(b,b+m);
int ans=0;
int cur=0;
int maxx=max(a[n-1],b[m-1]);
for(int i=0; i<=maxx; i++)
{
if(a1[i]==1&&b1[i]==1)
{
ans++;
cur=3;
}
else if(a1[i]==1&&b1[i]==0&&(cur==0||cur==2||cur==3))
{
ans++;
cur=1;
}
else if(a1[i]==0&&b1[i]==1&&(cur==0||cur==1||cur==3))
{
ans++;
cur=2;
}
else if(a1[i]==0&&b1[i]==0)
continue;
}
cout<<ans<<endl;
return 0;
}