先声明一下下述的变量
N为总天数,
A[i]表示第i个数字,
f[i]和g[i]的定义见下文
Max=max(f[i])1<=i<=N
第一问就是个最简单的最长下降序列,f[i]表示当前包含第i个数字的最长下降序列,
第二问稍复杂,我的分析:
我的代码(因为答案可能很大,所以用了高精度,并重载了"+"运算
#include <fstream> #include <memory.h> using namespace std; ifstream fin("buylow.in"); ofstream fout("buylow.out"); const long long Mx=6000,Base=10; class BigNumber { public: int List[100],Ln; BigNumber() { memset(List,0,sizeof(List)); Ln++; } void maintain() { for(int i=1;i<=Ln;i++) { List[i+1]+=List[i]/Base; List[i]%=Base; } while(List[Ln+1]!=0) { List[Ln+1]+=List[Ln]/Base; List[Ln]%=Base; Ln++; } } BigNumber operator +(const BigNumber p)const { int Len=max(Ln,p.Ln); BigNumber ans=*this; for(int i=1;i<=Len;i++) ans.List[i]+=p.List[i]; ans.Ln=Len; ans.maintain(); return ans; } BigNumber operator -(const int p)const { BigNumber ans=*this;int i; ans.List[1]-=p; while(ans.List[i]<0) { ans.List[i]+=10; ans.List[i+1]-=1; } return ans; } void Out() { for(int i=Ln;i>=1;i--) fout<<List[i]; fout<<endl; } }Mp,g[Mx]; long long N,A[Mx],f[Mx],Max; int main() { long long i,j; fin>>N; for(i=1;i<=N;i++) { fin>>A[i]; f[i]=1; g[i].List[1]=1; } for(i=1;i<=N;i++) { for(j=i-1;j>=1;j--) if(A[i]<A[j]) { if(f[j]+1>f[i]) f[i]=f[j]+1,g[i]=g[j]; else if(f[j]+1==f[i]) g[i]=g[i]+g[j]; } else if(A[i]==A[j]) { A[j]=-1; f[j]=-1; } if(Max<f[i]) Max=f[i]; } for(i=Max;i<=N;i++) if(f[i]==Max) Mp=Mp+g[i]; fout<<Max<<" "; Mp.Out(); fin.close(); fout.close(); return 0; }
2024年2月22日 19:52
We need many stories, Like genuinely appreciated, You want addiitional data over it, mainly because it can be reasonably exceptional., Take care exclusively for declaring