zoukankan      html  css  js  c++  java
  • POJ3274-Gold Balanced Lineup

    题目链接:点击打开链接

    Gold Balanced Lineup

    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 16978   Accepted: 4796

    Description

    Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to narrow down the list of features shared by his cows to a list of only K different features (1 ≤ K ≤ 30). For example, cows exhibiting feature #1 might have spots, cows exhibiting feature #2 might prefer C to Pascal, and so on.

    FJ has even devised a concise way to describe each cow in terms of its "feature ID", a single K-bit integer whose binary representation tells us the set of features exhibited by the cow. As an example, suppose a cow has feature ID = 13. Since 13 written in binary is 1101, this means our cow exhibits features 1, 3, and 4 (reading right to left), but not feature 2. More generally, we find a 1 in the 2^(i-1) place if a cow exhibits feature i.

    Always the sensitive fellow, FJ lined up cows 1..N in a long row and noticed that certain ranges of cows are somewhat "balanced" in terms of the features the exhibit. A contiguous range of cows i..j is balanced if each of the K possible features is exhibited by the same number of cows in the range. FJ is curious as to the size of the largest balanced range of cows. See if you can determine it.

    Input

    Line 1: Two space-separated integers, N and K.
    Lines 2..N+1: Line i+1 contains a single K-bit integer specifying the features present in cow i. The least-significant bit of this integer is 1 if the cow exhibits feature #1, and the most-significant bit is 1 if the cow exhibits feature #K.

    Output

    Line 1: A single integer giving the size of the largest contiguous balanced group of cows.

    Sample Input

    7 3
    7
    6
    7
    2
    1
    4
    2

    Sample Output

    4

    Hint

    In the range from cow #3 to cow #6 (of size 4), each feature appears in exactly 2 cows in this range

    题目大意:n头牛,有k种特征。给出每种奶牛的ID,他的二进制的1的位数表示他有哪个特征,求奶牛每种特征出现次数相同的连续最长长度。

    解释:

    思路:看了题解理解了。根据条件:区间每种特征出现次数相同。用sum[i][j]表示从1到i头牛的j特征出现的次数。那么就有:sum[i][0] - sum[j][0] = sum[i][1] - sum[j][1] = ......= sum[i][k-1] - sum[j][k-1]   上式可以改写为:sum[i][k-1] - sum[i][0] = sum[j][k-1] - sum[j][0]   令C[i][Y] = sum[i][Y] - sum[i][0]   (0<Y<k)  初始条件C[0][Y] = 0  所以只需要求 C[i][] == C[j][] 中j-i的最大值

    AC代码:

    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<math.h>
    using namespace std;
    const int N=100010;
    const int inf=1<<29;
    int n,k,tz[N][40],ms[N][40],sum[N][40],key[N],ans;
    vector<int>a[N];// 
    
    void search(int knum,int id) {
    	int len=a[knum].size();
    	for(int j=0; j<len; ++j) {//这种key里的id的C数组的数字是否全部一样 
    		int f=1;
    		for(int l=0; l<k; ++l)
    			if(ms[a[knum][j]][l]!=ms[id][l]) {
    				f=0;
    				break;
    			}
    		if(f) {
    			ans=max(ans,id-a[knum][j]);
    			return;
    		}
    	}
    	a[knum].push_back(id);//这种key里所有的id   
    }
    int main() {
    	int t,i,j;
    	scanf("%d%d",&n,&k);//得到sum数组 
    	for(int i=1; i<=n; ++i) {
    		scanf("%d",&t);
    		for(int j=0; j<k; ++j) {
    			tz[i][j]=t%2;
    			t/=2;
    		}
    	}
    	for(i=0; i<N; ++i) a[i].clear();
    	a[0].push_back(0);
    	for(i=1; i<=n; ++i) {//得到C数组   并且求得每一头牛的哈希值 
    		for(j=0; j<k; ++j) {
    			sum[i][j]=sum[i-1][j]+tz[i][j];
    			ms[i][j]=sum[i][j]-sum[i][0];
    			key[i]+=ms[i][j];
    		}
    		key[i]=abs(key[i])%N;
    	}
    	for(i=1; i<=n; ++i) search(key[i],i);//搜 
    	printf("%d",ans);
    	return 0;
    }
    

    以上的代码比较好理解,上面的解释参考了两位神犇的博客:

    神犇①点击打开链接                    神犇②点击打开链接

    还有一道与该题思路一样的题目:点击打开链接  可以对比理解

  • 相关阅读:
    Kubernetes如何支持有状态服务的部署?
    Web 安全入门-书籍及建议
    docker kubernetes swarm spring cloud结合学习资源
    docker-compose 完整打包发布, 多服务,多节点SPRING CLOUD ,EUREKA 集群
    Kubernetes权威指南学习笔记(一)
    解决k8s出现pod服务一直处于ContainerCreating状态的问题的过程
    Spark操作—aggregate、aggregateByKey详解
    maven设置------settings.xml文件学习
    Scala详细环境安装与配置
    内存泄露
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/9572965.html
Copyright © 2011-2022 走看看