题目大意:

8888年,地球被PPF王国统治了。由于人口增长,PPF需要为新生儿找寻更多的陆地。最后,PPF决定攻击通知Mars火星的Kscinow。问题来了,怎样让士兵到火星上去呢?PPF召集士兵征询建议。最后决定从哈利波特那里买些魔法扫帚,让士兵们飞上去~现在那些士兵正在学习使用魔法扫帚。我们假设每个战士都有一个等级表示他的级别。高等级的战士可以指导低等级的,但是反过来不可以。一个战士最多有一名指导者,也可以没有指导者。类似的,一个战士最多可以指导一名学习者,也可以不指导任何人。指导者和学习者可以共用同一把扫帚。所有的战士必须在飞往火星之前准备好。扫把很贵,怎样才能使所需要的扫把数量最少?

例如,有五个战士a,b,c,d,e,他们级别是2,4,5,6,4;

方法一:

c teach b,bteach a,所以a,b,c可以使用一把扫帚;

d teach e,所以d,d可以使用一把扫帚;

这样就需要2把;

方法二:

d teach a,所以a,d用一把;

c teach b,所以b,c用一把;

e自用一把;

这样就需要3把;

。。。

最后在所有可能的方法中,我们发现最少要2把;

输入:多组测试用例

第一行:正整数N(0-3000)表示战士个数;

接下来N行,每行一个非负整数,表示战士级别;(不超过30位)

输出:每组测试用例,输出最少需要的扫把数;

===========由题可知===========

1、相同的数最多有几个。

2、如果战士级别不超过18位,那就可以用__int64或者long long来解决了,但是题目中要求30位,只能用字符串解决;

3、不到3000个士兵,也就是最多3000个士兵级别

==========代码【From HDUACMppt】==========

#include "stdio.h"
#include "memory.h"
#define MAXN 7003
inline int ELFhash(char *key)//一个Hash函数,通过key得到一个位置h
{unsigned long h = 0,t;unsigned long g;while( *key ){t =( h<< 4) ;h = t + *key++;//h右移四位,把*key的ASCII码存储在h的低四位;【★0-9的ASCII码的后四位正好就是0-9的值】g = h & 0xf0000000L;//取h的高四位if( g )h ^= g >> 24;//如果h的高四位非0,就把高四位右移24位(因为第四位存放的是刚放进来的数,所以不能右移28位)h &= ~g;//把h的高四位清零
    }return h;//返回hash函数得到的位置
}
int hash[MAXN],count[MAXN];//hash数组用来存放级别;count数组用来统计出现次数
int maxit,n;//n是士兵个数;maxit是最大重复次数
inline void hashit(char *str)
{int k,t;while( *str == '0' )    str++;//去首0k = ELFhash(str);//得到位置t = k % MAXN;//确定位置while( hash[t] != k && hash[t] != -1 )//解决冲突,找到一个空位置或者已经存放了k的位置t = ( t + 10 ) % MAXN;if( hash[t] == -1 )//t位置为空    count[t] = 1,hash[t] = k;else//t位置已经存放了kif( ++count[t] > maxit ) maxit = count[t];//更新最大重复次数
}
int main()
{char str[100];//存储士兵级别的字符串while(scanf("%d",&n)!=EOF)//读取士兵个数n
    {memset(hash,-1,sizeof(hash));for(maxit=1,gets(str);n>0;n--){gets(str);//读取级别hashit(str);//处理士兵级别字符串
        }printf("%d\n",maxit);}
}

注意其中的hash函数:ELFHash,是字符串处理常用的一个hash函数;

关于这个hash函数解释的一篇文章:http://blog.csdn.net/zhccl/article/details/7826137

// ELF Hash Function
unsigned int ELFHash(char *str)
{unsigned int hash = 0;unsigned int x = 0;while (*str){hash = (hash << 4) + (*str++);//hash左移4位,把当前字符ASCII存入hash低四位。 if ((x = hash & 0xF0000000L) != 0){//如果最高的四位不为0,则说明字符多余7个,现在正在存第8个字符,如果不处理,再加下一个字符时,第一个字符会被移出,因此要有如下处理。//该处理,如果对于字符串(a-z 或者A-Z)就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位//因为1-4位刚刚存储了新加入到字符,所以不能>>28hash ^= (x >> 24);//上面这行代码并不会对X有影响,本身X和hash的高4位相同,下面这行代码&~即对28-31(高4位)位清零。hash &= ~x;}}//返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。(我们可以考虑,如果只有字符,符号位不可能为负)return (hash & 0x7FFFFFFF);
}

另一个人给的大同小异的解释:

unsigned  int  ELFHash( char   * str)
{ unsigned  int  hash  =   0 ; unsigned  int  x     =   0 ; while  ( * str) { hash  =  (hash   < <   4 )  +  ( * str ++ ); //hash值左移4位加上一个字符if  ((x  =  hash  &   0xF0000000L )  !=   0 )//判断hash值的高4位是否不为0,因为不为0时需要下面特殊处理,否则上面一步的左移4位会把这高四位给移走,造成信息丢失
    { hash  ^=  (x  >>   24 );   //把刚才的高4位跟hash的低5-8位异或hash  &=   ~ x;            //把高4位清0
    }  }  return  (hash  &   0x7FFFFFFF ); //希望hash值是一个非负数
}  

很遗憾,没有在网上搜到关于这个hash函数的原理。。。

转载于:https://www.cnblogs.com/CheeseZH/archive/2012/12/19/2824879.html

HDOJ1800 Flying to the Mars【Hash】相关推荐

  1. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  2. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  3. P3370-[模板]字符串哈希【hash】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3370 大意 输出若干个字符串,求输入的字符串的总个数. 解题思路 ...

  4. jzoj3464-秀姿势【hash】

    正题 给出n个数,删去k种数,使一种数连续的最长. 解题思路 用hash表储存每种数在leftleftleft到iii这个区间内没种数的个数,然后如果这个区间内的种数超过k+1个那么就移动left&q ...

  5. 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)

    正题 luogu 1019 题目大意 给你若干个词语,让你把他们连起来(重复段叠在一起),每个词语最多用两次,问你该串最长是多少 解题思路 dfs枚举一个单词后面接哪个单词,然后枚举重叠长度,再用ha ...

  6. HDOJ1496 Equations【Hash】

    题目大意: 有一个等式, a*x1^2+b*x2^2+c*x3^2+d*x4^2=0, a.b.c.d是[-50,50]之间的非零整数, 有一组解析(x1,x2,x3,x4),其中xi是[-100,1 ...

  7. bzoj 2761: [JLOI2011]不重复数字【hash】

    map会T,双hash会冲突--于是非酋写了个三hash #include<iostream> #include<cstdio> #include<cstring> ...

  8. 【HASH】【UVA 10125】 Sumset

    传送门 Description 给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈S Input 多组数据,每组数据包括: 第一行一个整数n,代表元素个数 下面n行每行一个整 ...

  9. 【hash】兔子与兔子(C++)

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 376 Solved: 75 [Submit][Status][Web Board] Descripti ...

最新文章

  1. cocos2dx的图片载入
  2. 引入OAuth2的主要目的
  3. golang 导入自定义包_goLang引入自定义包的方法
  4. 东南亚旅游安全指南【菲事件警记】
  5. 东莞.NET技术线下沙龙活动资料分享
  6. 【7集iCore3基础视频】7-2 iCore3原理图介绍
  7. poj-1201 Intervals(差分约束)
  8. 震后十年,他重走那条生死送货线
  9. python编程(virtualenv环境)
  10. oracle安装实验,Oracle之课程实验一(安装oracle)
  11. [Hive]Hive常用的优化方法
  12. [转摘] 我的同学聚会--性格决定命运
  13. java判断天数_Java判断两个日期相差天数的方法
  14. 平板电脑开机出现android,平板电脑常见故障解决方法
  15. python 小于号大于号是什么意思_大于号和小于号怎么区别
  16. ZCC9628单向全波无刷马达驱动芯片替代AM7228
  17. 前端八股文,https、跨域、闭包、原型链,布局、防抖节流等
  18. 给照片怎么拍板好看?
  19. 用Scipy实现K-means聚类算法
  20. 985助理教授与二本教授哪个水平高?

热门文章

  1. JavaScript学习(九十二)—关联数组的基本操作
  2. 力扣 根据数字二进制下1的数目排序
  3. 想安装一套监控,流程是什么?费用多少?
  4. 你们听过最感人的故事是什么?
  5. 草根最容易逆袭的地方就是互联网
  6. 马云欣赏你,你的创业就已成功了一半
  7. 为什么华为手机升级配置时大家就买账,苹果明明有创新点却被喷平庸令人失望?
  8. QTextStream
  9. Linux服务器安装JavaWeb环境(一) Jdk,Maven,Nginx,Tomcat
  10. redis本地服务启动和桌面客户端安装(Windows)