4 条题解

  • 0
    @ 2025-10-5 17:06:12

    题意概括 寻找使各科复习天数相同的最长的区间长度 暴力算法(得分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
    上传者