记录编号 77309 评测结果 AAAAAAAAAA
题目名称 越低越买 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.210 s
提交时间 2013-11-01 18:57:02 内存使用 4.29 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstring>
using namespace std;
const int SIZEL=101;
const int SIZEN=5010;
int n;
int price[SIZEN]={0};
int next[SIZEN]={0};
class HPINT{
public:
	int len;
	int s[SIZEL];//下标越大数位越高
	HPINT(){
		len=1;
		memset(s,0,sizeof(s));
	}
	void input(void){
		string str;
		cin>>str;
		len=str.size();
		int i;
		for(i=0;i<len;i++) s[len-i-1]=str[i]-'0';
	}
	void output(void){
		int i;
		for(i=len-1;i>=0;i--) printf("%d",s[i]);
	}
	void assign_one(void){
		len=1;
		s[0]=1;
	}
};
HPINT operator + (HPINT &a,HPINT &b){
	HPINT ans;
	int len=max(a.len,b.len);
	int i;
	for(i=0;i<len;i++) ans.s[i]=a.s[i]+b.s[i];
	for(i=0;i<len||ans.s[i];i++){
		ans.s[i+1]+=ans.s[i]/10;
		ans.s[i]%=10;
	}
	while(ans.s[len]) len++;
	ans.len=len;
	return ans;
}
int compare(HPINT &a,HPINT &b){//a>b:1,a<b:-1,a=b:0
	if(a.len>b.len) return 1;
	if(a.len<b.len) return -1;
	int i;
	for(i=a.len-1;i>=0;i--){
		if(a.s[i]>b.s[i]) return 1;
		if(a.s[i]<b.s[i]) return -1;
	}
	return 0;
}
class DATA{
public:
	int pos;
	HPINT price;
};
DATA a[SIZEN];
int compare(DATA &x,DATA &y){//x>y:1,x<y:-1,x=y:0
	return compare(x.price,y.price);
}
bool cmp(DATA x,DATA y){
	return compare(x,y)==-1;
}
void read(void){
	scanf("%d",&n);
	int i;
	for(i=1;i<=n;i++){
		a[i].pos=i;
		a[i].price.input();
	}
}
void remark(void){
	int i,tot=1;
	for(i=1;i<=n;i++){
		if(i>1&&compare(a[i].price,a[i-1].price)==1) tot++;
		price[a[i].pos]=tot;
	}
}
void getnext(void){
	int i,j;
	for(i=1;i<=n;i++){
		for(j=i+1;j<=n;j++){
			if(price[j]==price[i]){
				next[i]=j;
				break;
			}
		}
	}
}
int f[SIZEN]={0};//以f[i]表示以a[i]为结尾的最长下降子序列长度
HPINT pronum[SIZEN];
void dp(void){
	int i,j;
	for(i=1;i<=n;i++) f[i]=1,pronum[i].assign_one();
	for(i=2;i<=n;i++){
		for(j=1;j<i;j++){
			if(next[j]&&next[j]<i) continue;
			if(price[i]>=price[j]) continue;
			if(f[i]==f[j]+1) pronum[i]=pronum[i]+pronum[j];
			else if(f[i]<f[j]+1) pronum[i]=pronum[j];
			f[i]=max(f[i],f[j]+1);
		}
	}
}
int main(){
	freopen("buylow.in","r",stdin);
	freopen("buylow.out","w",stdout);
	read();
	sort(a+1,a+1+n,cmp);
	remark();
	n++,price[n]=0;
	getnext();
	dp();
	cout<<f[n]-1<<" ";
	pronum[n].output();cout<<endl;
	return 0;
}