题目的意思是有n只奶牛,k种特性,每个奶牛有一个数值,转换成二进制数第i位为0表示没有第i种特性
为1表示有。求一个最大的范围,使得该范围内每种特性出现的次数都一样
做法,先转换成二进制
然后累加,d[k][i]表示1到k只奶牛有i特性的奶牛一共有多少只
若d[i][k]-d[j][k]对于所有的k都相等,则表示i+1到j这一段的奶牛满足条件。
但是现在枚举的复杂度在n*n,超时
再思考下,可以做如下变换
对于d[i][]的每一位,都减去最小的一位。做这个转化是为了简化判断
现在的判定变成了d[i][k]==d[j][k]对于所有的k都满足
到了这一步
相信有哈希基础的朋友都能想到o(nk)的做法了
把每个d[k]做一次哈希。
我采取的哈希办法为每个值累加。
解决碰撞的方法用的是数组模拟链表。
#include
#include
#include
using namespace std;
const int maxn=111111,inf=9999999;
int d[maxn][32],a[maxn];
int ans;
int n,m;
int lon;
struct
{
}hash[311111];
int gethash(int d[])
{
}
int check(int d[],int k)
{
// printf("%d
%d\n",txt,k);
//
printf("%d
%d\n",k,hash[txt].key);
}
int main()
{
//
for(int k=1;k<=n;k++)
//
{
//
for(int
i=1;i<=m;i++)
//
printf("%d
",d[k][i]);
//
printf("\n");
//
}
}

本文介绍了一种解决特定问题的高效算法,旨在找到一组奶牛中,不同特性分布均匀的最大区间。通过二进制转换和哈希技术,实现算法优化,避免了传统方法的超时问题。
1651

被折叠的 条评论
为什么被折叠?



