Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

神牛小R在许多方面都有着很强的能力,具体的说,他总共有m种能力,并将这些能力编号为1到m。他的能力是一天一天地提升的,每天都会有一些能力得到一次提升,R对每天的能力提升都用一个数字表示,称之为能力提升数字,比如数字13,转化为二进制为1101,并且从右往左看,表示他的编号为1,3,4的能力分别得到了一次提升。小R把每天表示能力提升的数字的记了下来,如果在连续的一段时间内,小R的每项能力都提升了相同的次数,小R就会称这段时间为一个均衡时期,比如在连续5天内,小R的每种能力都提升了4次,那么这就是一个长度为5的均衡时期。
于是,问题来了,给出 小R n天的能力提升数字,请求出均衡时期的最大长度。

【输入格式】

第一行有两个整数n,m,表示有n天,m种能力。接下来有n行,每行有一个整数,分别表示第1到n天的能力提升数字。能力提升数字转化为二进制后,从右到左的每一位表示对应的能力是否在当天得到了一次提升。 n<=100000, m<=30

【输出格式】

输出只有一个整数,表示长度最大的均衡时期的长度。

【数据规模】

对于50%的数据,N <= 1000。

Sample Input1

7 3
7
6
7
2
1
4
2

Sample Output1

4

【样例说明】

每天被提升的能力种类分别为:
第一天:1,2,3
第二天:2,3
第三天:1,2,3
第四天:2
第五天:1
第六天:3
第七天:2
第三天到第六天为长度最长的均衡时期
因为 这四天 每种能力分别提升了 2次

【题解】

设在第i天,所得到的能力值组成的数列为a1,a2,a3..an;

则我们要找之前的一个数列a1-k,a2-k,a3-k..an-k;(尽量靠前找)

这个数列和第i天的数列的差值,就是所需要的均衡时期。

也即所有的能力都提升了相同的值。

我们可以这样做。

在第i天加完之后。把数列中所有的值都减去那个最小值。(每个值减去的数都是一样的,满足均衡发展的题意);

然后看看之前有没有出现过这个数列(我们存的都是最早出现的)。

如果有出现。则就用这两个数列的天数差作为temp,尝试更新ans.

这里的寻找过程,需要用到hash函数。

随便写一个hash函数,然后取模,用链表来处理冲突就可以了。

这里的hash函数就是每一个数值*ascill码值然后对100007取模

【代码】

#include <cstdio>

struct point
{
int shulie[40], where;//这是链表的结构体。
point *next;
}; int n, m,totn=1,ans = 0;
int st[40]; point *h[100007]; //这是链表的头结点和尾节点。
point *t[100007]; int sear_ch(int a[], int where) //当前这个数列是在第where天找到的。
{
int key = 0;
for (int i = 1; i <= m; i++)//构造出hash函数
key = (key + a[i] * (a[i]+'0'))%100007;//要对100007取模
point *p = h[key]; //取出这个hash值的头结点。
while (p != NULL) //在头结点和尾节点之间寻找这个数列
{
bool find = true;
for (int i = 1;i <= m;i++)
if (p->shulie[i] != a[i])//只要有一个不同,它就不是这个数列
{
find = false;
break;
}
if (find)//如果找到了,就返回它第一次出现的位置。
return p->where;
p = p->next;//否则继续找
}
p = new point;//如果没有找到就创立一个新的节点
p->next = NULL;
for (int i = 1; i <= m; i++)//把这个数列存在这个节点中
p->shulie[i] = a[i];
p->where = where;//记录一下它的天数
t[key]->next = p;//把节点接在尾节点后面。
t[key] = t[key]->next;
return p->where;
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
for (int i = 0; i <= 100007; i++)
{
h[i] = new point;
h[i]->next = NULL;
h[i]->where = 0; //初始化头结点和尾节点。
t[i] = h[i];
}
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) //一开始所有的能力值都为0
st[i] = 0;
sear_ch(st, 0);//把这个初始数列加入到hash表中
for (int i = 1; i <= n; i++)
{
int x, now = 0, min = 2100000000;
scanf("%d", &x);
while (x > 0)//先将其转换成二进制
{
now++;
int temp = x % 2;
if (temp == 1) //如果是1就加上1
st[now]++;
x /= 2;
}
for (int j = 1; j <= m; j++)//寻找最小值
if (st[j] < min)
min = st[j];
if (min > 0)
for (int j = 1; j <= m; j++)//把数列的每一个数字减去min
st[j] -= min;
int pre = sear_ch(st, i);//查找之前出现过的下标最小的这个数列的下标
if (i - pre > ans)//看看这个差能不能更新答案。
ans = i - pre;
}
printf("%d", ans);
return 0;
}

【u032】均衡发展的更多相关文章

  1. 从ACM会议分析我国计算机科学近十年发展情况

    从ACM会议分析我国计算机科学近十年发展情况 来源:<中国计算机学会通讯>2015年第10期<专栏> 作者:陈 钢 2006年,承蒙李国杰院士推荐,<中国计算机学会通讯& ...

  2. GTD

    这两天坚持GTD,四分象限法管理时间,感觉学习专注度明显提升,一直没完成的马士兵JAVA基础整到第八章了,继续保持,1.13号前争取11章全整完. 3个点支撑起你的职业发展:技术,管理(管理自己.管理 ...

  3. 经典DOS游戏皇帝攻略(曾经的回忆)

    最完美攻略>>>>> -------------------------------------------------------------------------- ...

  4. 全解┃OpenStack Newton发布,23家中国企业上榜(转载)

    (转载自Openstack中文社区) 陈, 翔 2016-10-8 | 暂无评论 美国奥斯汀时间10月6日(北京时间6日24点),OpenStack Newton版本正式发布,在可扩展性.可靠性和用户 ...

  5. Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感

    Atitit  华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感 序 言上篇:价值创造.评价与分配第一章 全力创造价值1.1 围绕价值创造展开人力资源管理1.1.1 什 ...

  6. 【English】【托业】【四六级】写译高频词汇

    大家都知道,四六级翻译每次考的话题不可能原句直接重复,但是,在研究了近几年的四六级真题后,我们惊奇地发现: 写译词汇在重复考! 写译词汇在重复考! 写译词汇在重复考! 因此,小编为大家整理了四六级写译 ...

  7. java.util.DualPivotQuickSort的实现

    DualPivotQuickSort汇集了多种排序算法,称之为DualPivotQuickSort并不合适.不同的排序算法有不同的使用场景.看懂此文件,排序算法就算彻底搞懂了. 本文只介绍有用的代码片 ...

  8. B端产品经理的金字塔能力模型

    工作这几年,时长思考,作为B端产品经理自己应该具备什么样的能力? 虽然工作依旧在有条不紊的进行,但是时常会陷入到对知识或者能力的焦虑当中.特别时是工作三五年,产品经理进阶门槛时. 虽然产品经理的能力是 ...

  9. 思维导图趋势大分析(MindMaster与百度脑图)

    思维导图现在可以说是大流行期间,涉及学习.工作.生活方方面面的内容. 一.什么是思维导图 思维导图的英文名称是The Mind Map,也叫做心智导图,脑图,心智地图,脑力激荡图等.思维导图应用图文兼 ...

随机推荐

  1. APK文件浅析-Android

    2011~2015,5年时间,断断续续学习了Android.  最近打算在2011年2个月认真学习的基础上,深入学习下.  由于有之前的Android基础,加上N年的Java等变成经验,自我感觉And ...

  2. 支付宝支付Java后台总结

    这个支付的流程是前端H5(APP等)需要支付时调用后台的接口拿到我们加密的签名去调起支付宝的支付界面(支付宝APP)进行支付操作,并且前端在支付成功后,支付宝后台会回调一个我们在签名时写入的一个接口地 ...

  3. secureCRT The remote system refused the connection问题解决

    问题: Ubuntu系统必须开启ssh服务后,XP或者其它的主机才干够远程登陆到Ubuntu系统. 1,安装软件包,运行sudo apt-get install openssh-server Ubun ...

  4. Spark 概念学习系列之Spark存储管理机制

    Spark存储管理机制 概要 01 存储管理概述 02 RDD持久化 03 Shuffle数据存储 04 广播变量与累加器 01 存储管理概述 思考: RDD,我们可以直接使用而无须关心它的实现细节, ...

  5. python,寻找班级里面名字最长的人

    寻找班级里面名字最长的人 我有一串字符串人名:names=(' Kunpen Ji, Li XIAO, Caron Li,' ' Dongjian SHI, Ji ZHAO, Fia YUAN Y,' ...

  6. Dcloud课程7 单例模式一般用在什么场景

    Dcloud课程7 单例模式一般用在什么场景 一.总结 一句话总结:连接数据库,这样就保证了和数据之间只有一个连接,从而能够不占用多余资源,这样就极大的减少了资源浪费,减少了mysql或者说服务器压力 ...

  7. JQ实现选项卡(jQuery原型插件扩展)

    下边分为两个版本,一种是点击切换选项(index.js),一种是滑过切换选项(index1.js) HTML文件: jq使用jquery-1.11.3.js版本 <!DOCTYPE html&g ...

  8. jQuery的原理

    JQ的原理 jquery-1.xxx :专门为PC端诞生的类库,兼容所有的浏览器 jquery-2.xxx:当初是为了移动端而准备的,所以IE低版本浏览器一般不兼容,但是这个版本针对移动端的事件等操作 ...

  9. POJ 3061 Subsequence 二分或者尺取法

    http://poj.org/problem?id=3061 题目大意: 给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. 思路: ...

  10. Java BigDecimal的基本使用方法

    1.对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类 2.运算速度比一般的+.-.*./要快 3.基本方 法描 述  ...