虽然是 python 题,但我还是用 C++ 做了。
题目大意
这道题的代码其实很简单,只是难在读题。
给出两个长度为 n n n 的数组 s s s 和 t t t。从中拿出一些元素组成序列 s i 1 , t i 2 , s i 3 , t i 4 , ⋯ s_{i_1},t_{i_2},s_{i_3},t_{i_4},\cdots si1,ti2,si3,ti4,⋯,使得 i 1 < i 2 < i 3 < i 4 < ⋯ i_1<i_2<i_3<i_4<\cdots i1<i2<i3<i4<⋯,且序列中所有元素的值包含 0 , 2 , 4 0,2,4 0,2,4,注意,相邻的元素间不需包含相同的共鸣元素,有共鸣元素即可。求该序列最长是多少。
思路讲解
因为我们要交替着从两数组中取走元素,所以设一个变量 w w w,表示我们现在要取哪一个数组的元素。
枚举 1 ∼ n 1 \sim n 1∼n,因为我们要答案最大,所以如果我们取的那个数组该位置的值包含共鸣元素 0 , 2 , 4 0,2,4 0,2,4,则将答案加 1 1 1,并将 w w w 设为另一个数组,继续寻找答案。
代码实现
#include <bits/stdc++.h>
using namespace std;
int n,s[100005][2],ans=0;//二维数组更加方便查找
bool check(int x){//判断是否包含共鸣元素
while(x){
if(x%10==0 || x%10==2 || x%10==4)
return true;
x/=10;
}
return false;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i][0];
for(int i=1;i<=n;i++)
cin>>s[i][1];
int w=0;//将w设为0,因为要先找第一个数组
for(int i=1;i<=n;i++)
if(check(s[i][w]))
ans++,w=(w+1)%2;//如果有共鸣元素,将答案加1,并将w设为另一个数组。
cout<<ans;
return 0;
}
完结撒花!