1. 程式人生 > >POJ - 4044 Score Sequence 模擬+貪心

POJ - 4044 Score Sequence 模擬+貪心

題目連結:點選檢視

題意:給出兩個班級的成績,先按降序排序,去重。然後求連續的最長公共子序列。輸出時,先輸出最長公共子序列,然後按個位數字遞增的順序輸出,若各位數字一樣就按成績遞增。

題解:模擬寫就可以了

#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;
}