记录编号 420124 评测结果 AAAAAAAAAA
题目名称 低价购买 最终得分 100
用户昵称 GravatarOstmbh 是否通过 通过
代码语言 C++ 运行时间 0.514 s
提交时间 2017-07-03 21:25:34 内存使用 4.60 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
struct BIG{
	int length;
	int num[110];
	BIG(){
		length=0;
		memset(num,0,sizeof(num));
	}
	bool operator < (const BIG& a)const{
		if(length!=a.length)
			return length<a.length;
		for(int i=length;i>=1;i--)
			if(num[i]!=a.num[i])
				return num[i]<a.num[i];
		return false;
	}
	BIG operator + (const BIG& a)const{
		BIG c=a;
		c.length=105;
		for(int i=1;i<=length;i++){
			c.num[i]+=num[i];
			if(c.num[i]>=10){
				c.num[i]-=10;
				c.num[i+1]++;
			}
		}
		while(c.num[c.length]==0&&c.length!=0)
			c.length--;
		return c;
	}
	bool operator==(const BIG&c)const{
		if(length!=c.length)
			return false;
		for(int i=1;i<=length;i++)
			if(num[i]!=c.num[i])
				return false;
		return true;
	}
}A[5010];
BIG g[5010];
int f[5010];
int pos[5010];
string s;
BIG transform_string(string c){
	int string_length=c.length();
	BIG b;
	b.length=string_length;
	for(int i=string_length-1;i>=0;i--)
		b.num[string_length-i]=c[i]-'0';
	return b;
}
BIG transform_integer(int a){
	BIG b;
	while(a){
		b.num[++b.length]=a%10;
		a/=10;
	}
	return b;
}
int main(){
	freopen("djgm.in","r",stdin);
	freopen("djgm.out","w",stdout);
	int n;
	scanf("%d\n",&n);
	BIG kd=transform_integer(1);
	for(int i=1;i<=n;i++){
		cin>>s;
		A[i]=transform_string(s);
		f[i]=1;
		g[i]=kd;
	}
	for(int i=1;i<=n;i++)
		pos[i]=i;
	int ans=0;
	BIG kans;
	for(int i=1;i<=n;i++){
		for(int j=i-1;j>=1;j--){
			if(A[i]<A[j]){
				if(f[i]<f[j]+1){
					f[i]=f[j]+1;
					g[i]=g[j];
				}
				else if(f[j]+1==f[i]&&pos[j]==j){
					g[i]=g[j]+g[i];
				}
			}
			else if(A[i]==A[j])
				pos[j]=i;
		}
	}
	for(int i=1;i<=n;i++)
		if(A[i]==A[n])
			pos[i]=n;
	for(int i=1;i<=n;i++)
		if(pos[i]==i){
			if(f[i]>ans){
				ans=f[i];
				kans=g[i];
			}
			else if(f[i]==ans){
				kans=kans+g[i];
			}
		}
	printf("%d ",ans);
	for(int i=kans.length;i;i--)
		printf("%d",kans.num[i]);
	printf("\n");
return 0;
}