1 条题解
-
0
暴力
6分思路
先暴力一下,如果说第个数的值是,那么暴力找出来剩下每一个数的值是多少,如果是幸运数字,就,最后用更新即可, 6分TLE
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; int a[N],b[15],n,m; signed main() { scanf("%lld%lld",&n,&m); for(int i=1;i<n;i++)scanf("%lld",&a[i]); for(int i=1;i<=m;i++)scanf("%lld",&b[i]); int ans=0; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) { int sum=1; for(int k=i-1,now=b[j];k>=1;k--) { now=a[k]-now; for(int dfs=1;dfs<=m;dfs++)if(now==b[dfs])sum++; } for(int k=i+1,now=b[j];k<=n;k++) { now=a[k]-now; for(int dfs=1;dfs<=m;dfs++)if(now==b[dfs])sum++; } ans=max(ans,sum); } printf("%lld\n",ans); return 0; }AC思路
注意到这样可能会有很多次重复计算,秉着算过了就不要再算的理念,我们尝试优化一下。对于一种相同的情况,的值一定是固定的,我们只需要开一个map存储当为的时候有多少个数是幸运数字。很明显直接求的常数复杂度大约左右……但是我们可以反着算,枚举每一个数,当他是每一种幸运数字的时候是多少,每一次更新即可。满分AC
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; int a[N],b[15],x[N],n,m; map<int,int>v; signed main() { scanf("%lld%lld",&n,&m); for(int i=1;i<n;i++)scanf("%lld",&a[i]); for(int i=1;i<=m;i++)scanf("%lld",&b[i]); for(int i=1;i<n;i++)x[i+1]=a[i]-x[i];//当a1是0的时候ai是多少 int ans=0; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) { if(i&1)v[b[j]-x[i]]++,ans=max(ans,v[b[j]-x[i]]);//如果说他是奇数位上的,他和a1是减法的关系,即a1-ai==x else v[x[i]-b[j]]++,ans=max(ans,v[x[i]-b[j]]);//反之是加法关系 } printf("%lld\n",ans); return 0; }甚至比暴力还短……
- 1
信息
- ID
- 9965
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者