题目链接:点击查看
题意:给出两个班级的成绩,先按降序排序,去重。然后求连续的最长公共子序列。输出时,先输出最长公共子序列,然后按个位数字递增的顺序输出,若各位数字一样就按成绩递增。
题解:模拟写就可以了
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
int n1,n2;
int a[N],b[N],c[N],len;
bool cmp1(int x,int y)
{
return x>y;
}
bool cmp2(int x,int y)
{
if(x%10!=y%10) return x%10<y%10;
else return x<y;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n1,&n2);
for(int i=1;i<=n1;i++)scanf("%d",&a[i]);
for(int j=1;j<=n2;j++)scanf("%d",&b[j]);
int i=1,j=1;
int pos,ans=0,cnt=0;
sort(a+1,a+1+n1);
sort(b+1,b+1+n2);
n1=unique(a+1,a+1+n1)-(a+1);
n2=unique(b+1,b+1+n2)-(b+1);
while(i<=n1&&j<=n2)
{
if(a[i]==b[j])
{
cnt++;
i++;j++;
}
else if(a[i]>b[j])
{
if(cnt>=ans)
{
ans=cnt;
pos=i-1;
}
cnt=0;
j++;
}else{
if(cnt>=ans)
{
ans=cnt;
pos=i-1;
}
cnt=0;
i++;
}
}
if(cnt>=ans)
{
ans=cnt;
pos=i-1;
}
if(ans==0) printf("NONE\n");
else
{
len=0;
for(int i=pos-ans+1;i<=pos;i++)
c[++len]=a[i];
sort(c+1,c+1+len,cmp1);
for(int i=1;i<=len;i++)printf("%d%c",c[i]," \n"[i==len]);
sort(c+1,c+1+len,cmp2);
for(int i=1;i<=len;i++)
printf("%d%c",c[i]," \n"[i==len]);
}
}
return 0;
}