POJ - 4044 Score Sequence 模擬+貪心
阿新 • • 發佈:2019-01-01
題目連結:點選檢視
題意:給出兩個班級的成績,先按降序排序,去重。然後求連續的最長公共子序列。輸出時,先輸出最長公共子序列,然後按個位數字遞增的順序輸出,若各位數字一樣就按成績遞增。
題解:模擬寫就可以了
#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; }