4 条题解
-
0
题意概括 寻找使各科复习天数相同的最长的区间长度 暴力算法(得分68)
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const long long N=1e5+10; long long n,m,k,a[N],b[N],ans,cnt; int main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } for(int i=1;i<=n;i++){ for(int y=1;y<=m;y++){ b[y]=0; } for(int j=i;j<=n;j++){ long long x=a[j]; for(int k=m;k>=1;k--){ if(x&1){ b[k]++; } x/=2; if(x==0)break; } bool flag=0; for(int z=2;z<=m;z++){ if(b[z]!=b[z-1]){ flag=1; break; } } if(flag==0){ ans=max(ans,(long long)(j-i+1)); } } } printf("%lld",ans); return 0; }正解思路 考虑使用前缀和算法,如果一个区间的左端点到右端点每位的增加量相同,那么这个区间就满足各科复习天数相同的题意 考虑到1 2 3 和0 1 2对于本题目统计答案而言是等价的,并且后者更便于统计答案,因此可以考虑将其化简为0 1 2 这种有一位为0的形式。 对于本题答案的统计,考虑使用map映射,借助count()函数统计答案。 AC代码
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<map> #include<vector> using namespace std; const long long N=1e5+10; int n,m,k,a[N],b[N],ans,cnt; map<vector<int> , int > mp; vector<int> v(34); int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } mp[v]=0; for(int i=1;i<=n;i++){ int x=a[i],minn=0; for(int j=m;j>=1;j--){ if(x&1)v[j]++; if(j==m)minn=v[j]; else minn=min(minn,v[j]); x/=2; } if(minn>0){ for(int j=m;j>=1;j--){ v[j]-=minn; } } if(mp.count(v)==1){ ans=max(ans,i-mp[v]); } else{ mp[v]=i; } } cout<<ans; return 0; }
信息
- ID
- 32
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 123
- 已通过
- 27
- 上传者