不对啊,为啥只有18分?

P1108 低价购买

唉不是,搞啥鬼ans啊?
by Mr_Terminator @ 2022-01-19 15:54:50


@[Tis员工](/user/430920) ans求得值有问题,题目问的是有多少种购买法子!
by Mr_Terminator @ 2022-01-19 15:55:32


那不然我一走怎么算(小声bb
by Tis员工 @ 2022-01-20 09:08:11


题目要求是“它们构成的价格队列不一样”,那么我准备拿一个数组存下这个最长下降子序列,但是这不现实,检查是否匹配是在最坏的情况下可能达到$O(N^3)$
by wstjy @ 2022-12-15 20:09:20


所以代码就来了 ------------ ```cpp #include<cstdio> #include<cstring> int max(int x,int y){return x>y?x:y;} int a[5001],f[5001],t[5001]; int main() { memset(f,0,sizeof(f)); memset(t,0,sizeof(t));//初始化方案 int n,maxx=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) if(a[i]<a[j])//延长已经存在的最长下降子序列 f[i]=max(f[i],f[j]+1); if(f[i]==0) f[i]++; if(f[i]>maxx) maxx=f[i]; for(int j=1;j<i;j++) if(f[i]==f[j]&&a[i]==a[j]) t[j]=0; else if(f[i]==f[j]+1&&a[i]<a[j]) t[i]+=t[j]; if(!t[i]) t[i]=1; } int sum=0; for(int i=1;i<=n;i++) if(f[i]==maxx) sum+=t[i]; printf("%d %d",maxx,sum); return 0; }
by wstjy @ 2022-12-15 20:10:40


|