2014 华为编程赛

来源:互联网 发布:样本量计算软件 编辑:程序博客网 时间:2024/05/06 06:42

第一轮:

1.投票问题

输入若干候选人,以及投票,格式如下,输出(按输入候选人输入顺序)候选人以及得票,以及
无效票数。
Input:
addCandidate xx1
addCandidate xx2
addCandidate xx3
addCandidate xx4
addCandidate xx5
addCandidate xx6
vote xx2
vote xx2
vote xx3
vote xx3
vote xx4
vote xx6
vote xx7
vote xx1
vote xx1
Output:
xx1 2
xx2 2
xx3 2
xx4 1
xx6 1
1

2.筷子问题

输入n(筷子数),输出不成对的筷子的长度,无效数据或者没有不成对的筷子输出-1(没有换
行),若有多个,输出一个任意一个即可。
Intput:
7
1 2 2 1 3 3 2
Output:
2

第二轮:

1.二进制数比较

来自星星的都教授除了所有感官比地球人高出七倍,始终容颜不老以外,还拥有一项在地球人看
来特别神奇的能力,他会瞬间(0.00000000000000000000001s以内)按照他的规则比较地球
人熟悉的两个十进制数字的大小,他比较的规则如下:
1.   将要比较的两个数字分别转换成二进制数字;
2.   计算两个二进制数字中1的个数,个数多的数字为两者中的大者;
3.   负数按照其绝对值进行比较;
请利用地球人发明的计算机程序逼近都教授的特异功能,实现时可以有以下约束:
1.   输入数据为范围在-32768到32768(地球人的十进制世界)之间的任意两个数字;
2.   如果经过比较后2个数相等,输出为0,如果不相等,输出最大值。如果输入非法,输出-1


2.笨笨熊搬家打包

森林里的笨笨熊今天可开心啦——他买了新房子,乔迁新喜要搬家了。因此,笨笨熊请了许多好
朋友来帮忙搬家,并准备了很多小纸盒用来装需要搬的物品,不过,这些纸盒的容积都是相同
的,并且最多只能装两个物品。但是,为了不打扰太多的朋友,笨笨熊想了个“聪明”办法:让每
个纸盒使用效率最高(注:只要纸盒容积大于物品的体积之和就认为可以装下;物品体积不会大
于纸盒容积),这样需要的纸盒最少。为了帮助笨笨熊提前通知朋友,请你根据笨笨熊的办法,
帮忙算出:需要纸盒的最少数目是多少?
输入:
整数V——纸盒的容积;
整数N——物品的总数目N;
共N个整数(对应N个物品的体积,每个整数用空格隔开)。
输出:
整数M——需要纸盒的最少数目
样例输入:
10
2
2 3
样例输出:
1

第三轮:


1. 亮着电灯的盏数

描述:       

一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。

运行时间限制:        无限制

内存限制:        无限制

输入:       

电灯(学生)的数量,例如:2

输出:       

亮着的电灯数量,如上述输入返回:1

样例输入:       

2

样例输出:       

1

答案提示:       

 

#include<iostream>#include<stdio.h>using namespace std;int main(){         longnum;         scanf("%ld",&num);         intresult=0;         for(longi=1;i<=num;i++)         {                   longtemp=0;                   for(longj=1;j<=i;j++)                   {                            if(i%j==0)                                     temp++;                   }                   if(temp%2!=0)                            result++;         }         printf("%ld\n",result);         return0;}


2. 电话号码本

描述:       

实现一个简易电话号码本的程序,存储电话号码,可以通过名字获取电话号码,同时也可以通过电话号码获取对应的名字。

 

说明:

1、名字由英文字母组成,区分大小写。1<=字母数量<=20

2、名字和电话号码一一对应

3、名字和电话号码均唯一

4、电话号码长度n,由数字组成。1<=n <=20

5、电话号码本中最大的记录条数为200

 

运行时间限制:        无限制

内存限制:        无限制

输入:       

输入命令字如下:

 

save       保存姓名和电话号码          示例:"savetom 13888888888"

getName    通过电话号码获取名字        示例:"getName13888888888"

getPhoneNum 通过名字获取电话号码        示例:"getPhoneNumtom"

delete     删除姓名对应的存储记录      示例:"deletetom"

count      获取电话号码本存储的总人数  示例:"count"

clear      清除电话号码本              示例:"clear"

注意:

输入时每行只有一条命令(比如:C语言可使用gets函数获取一行输入命令)。

命令中的多个单词间使用一个空格符隔开,如上面示例。

输出:       

1、若输入不符合要求(如:名字中含有非英文字母,或其他认为错误的输入)均需输出"error"。

2、每条输出后使用换行符隔开(见后面样例)。

 

输出要求:

1)保存电话号码本,保存成功后要求回显。例如输入"save tom 13888888888",则输出为"tom13888888888"。同时保存对应的名字和电话号码。如名字或电话号码存在,则输出"error"。如存储超过大小限制则输出"error"。

2)通过电话号码获取名字。例如输入"getName13888888888"则输出为"tom"。如无对应的电话号码,则输出"error"

3)通过名字获取电话号码。例如输入"getPhoneNumtom",则输出为"13888888888"。如无对应的名字,则输出"error"

4)删除对应的存储记录。例如当前存储的记录为"tom13888888888",输入"delete tom",则输出"ok"。输入"delete jack",则输出"error"。

5)获取电话号码本存储的总人数。例如当前存储两个电话号码。输入"count",则输出为"2"。

6)清除电话本。电话号码本记录清除,无需输出。

样例输入:       

save zhangsan 11111111

count

save lisi 22222222

count

getName 11111111

样例输出:       

zhangsan 11111111

1

lisi 22222222

2

zhangsan

答案提示:

第四轮:

1. 计算多个正整数的最大公约数

描述:       

计算多个(最多100个,最少一个)正整数(正整数的范围是:1~20000)的最大公约数。公约数是指:能被所有的整数整除的整数。

运行时间限制:        无限制

内存限制:        无限制

输入:       

第一个数字是整数的数量,后面是每个整数的具体值;

备注:读取的时候,不需要读入换行符'\n'

输出:       

最大公约数

备注:输出的时候,不需要输出换行符'\n'

样例输入:       

4

 

5 10 15 20

样例输出:       

5

答案提示:

 

#include <stdio.h>#include <stdlib.h> #define MAX_NUM          100 int gcd(int a,int b){         if(a==0)         {                   returnb;         }else         {                   returngcd(b % a,a);         }} int main(){         intn=0;         intiCount=0;         intin[MAX_NUM];         intout=0;          scanf("%d",&n);          for(iCount=0;iCount<n;iCount++)         {                   scanf("%d",&in[iCount]);                   out= gcd(out,in[iCount]);         }          printf("%d",out);         return0;}


2. 实现一个开放的书名检索库

描述:       

实现一个开放的书名检索库,库中存储了若干个书名

用户可以:

    1、通过接口加入书名

    2、指定搜索条件搜索库中符合条件的书名

 

重要格式说明

单词:

    由小写英文字母组成,不含其它字符

书名:

    由一个或多个单词组成

    当包含多个单词时,单词间用一个空格分隔

    第一个单词前和最后一个单词后没有空格

    若只包含一个单词,则该单词前后均无空格

 

搜索条件:

    1、由一个或多个不重复的关键字组成,每个关键字是一个单词。

    2、当包含多个关键字时,关键字间用一个空格分隔;第一个关键字前和最后一个关键字后没有空格

    3、若只包含一个关键字,则该关键字前后均无空格

    4、搜索包含指定关键字的书名,输出不需要排序(不影响自动阅卷)

    5、若搜索条件包含多个关键字,它们之间是“与”的关系,即书名中要同时包含所有指定的关键字(但不限制关键字在书名中出现的位置和顺序)

    6、必须是“全词匹配”,即书名中的单词和关键字完全一致,例如:关键字为man,书名中包括单词woman,则不认为该书名符合搜索要求

 

输出说明:

   1.如果没有查找到书名,那么输出一对双引号: ""

   2.如果存在多行输出(查找到多本书名),那么输出结果按字典序排序

 

举例

 

输入:

AddBooks

"high performance mysqlsecondedition"

"writing gnu emacs extensions"

"web client programming withperlautomating tasks"

"net test automation recipes a problemsolution approach"

"photoreading"

"pro wfwindows workflow in net"

"aspect oriented analysis and designthe theme approach"

SearchBooks

"extensions gnu"

End

输出:

"writing gnu emacs extensions"

 

输入:

AddBooks

"high performance mysqlsecondedition"

"writing gnu emacsextensions"

"web client programming withperlautomating tasks"

"net test automation recipes a problemsolution approach"

"photoreading"

"pro wfwindows workflow in net"

"aspect oriented analysis and designthe theme approach"

SearchBooks

"approach"

End

输出:

"aspect oriented analysis and designthe theme approach"

"net test automation recipes a problemsolution approach"

 

 

规格

 0<=书名个数范围<=200

   1<=书名所含单词个数<=10

   1<=单词所含字母数<=50

   1<=搜索条件中关键字个数<=3

 

运行时间限制:        无限制

内存限制:        无限制

输入:       

AddBooks

[书名列表:每行一个书名,书名在双引号中]

SearchBooks

[关键字:多个关键字用空格分隔,关键字在双引号中]

End

 

输出:       

1. 查找到的书名,查找到多个书名,以多行显示,书名在双引号内

2. 如果没有查找到书名,那么输出:""

3. 如果存在多行输出(查找到多本书名),那么输出结果按字典序排序

    如下:

   "aspect oriented analysis and design the theme approach"

   "net test automation recipes a problem solution approach"

 

    字母a 在字典序中排在字母n前面,所以显示的时候"aspect oriented analysis and design the theme approach"排在前面

    如果一个字符相等,那么顺序比较后面的字符,直到找到一个字符不相等为止

样例输入:       

AddBooks

"high performance mysqlsecondedition"

"writing gnu emacs extensions"

"web client programming withperlautomating tasks"

"net test automation recipes a problemsolution approach"

"photoreading"

"pro wfwindows workflow in net"

"aspect oriented analysis and designthe theme approach"

SearchBooks

"extensions gnu"

End

样例输出:       

"writing gnu emacs extensions"

第五轮:

2. TLV编码排序

描述:
TLV是Tag Length Value的缩写,它是一种变长数据的编解码;一个TLV基本信息单元(Information Element)简称为IE, 由Tag,Length(value的长度)及Value三个域组成,下图给出了IE在消息中的结构和单个IE的实例说明。

消息中的IE固定由Tag,Length,Value域组成;Tag固定占4个字节,Length固定占2个字节。根据IE的Tag值的大小对消息中所有的IE排序,并输出。字节序按照大端序处理。

运行时间限制:
无限制
内存限制:
无限制
输入:
从标准输入以16进制字符串的形式将消息码流输入,字符串中,每两个字符表示一个字节,如输入:0000000400012a,则表示输入的对应码流为:0x00 0x00 0x00 0x04 0x00 0x01 0x2a
约定: 16进制字符串的合法性(字符仅包含0-9、a-f,字符个数为偶数)由输入保证,考生不用检查。但消息本身是否符合TLV编码规则,需要由考生编程进行判断。


输出:
将经过排序处理后的消息码流,以16进制字符串的形式输出到标准输出。
如果消息编码错误,即无法从消息码流中正确解析出各个IE,则输出msgerr


样例输入:
0000007f000100000000660002ab02
样例输出:

第六轮:

1.分苹果问题

小明准备把M个同样的苹果分在N个同样的篮子里,允许有的篮子空着不放,那么一共有多少种
不同的分法呢?
说明:3,1,1和1,3,1 是同一种分法。
输入:
每个用例包含二个整数M和N。0<=M<=10,1<=N<=10。
输出:
一个整数K,表示一共有K种分苹果的方法。
样例输入:
7 3
样例输出:

8

说明:参考网上有关递归的方法写的,提交后个测试用例不通过

#include<iostream>using namespace std;int fun(int m,int n){if(m<0)return 0;if(m==0||n==1)return 1;return fun(m-n,n)+fun(m,n-1);}int main(int argc,char *argv[]){int m,n,k;cin>>m>>n;k= fun(m,n); cout<<k<<endl;return 0;}

下面的程序也是参考网上的程序编写的,也有测试用例不通过

#include<iostream>#include<stdio.h>#include<vector>using namespace std;int solution(int n, int k, int min) //将n分为k个整数 最小的大于等于min,最大不超过B {    if(n < min) return 0;//当剩下的 比min小,则不符合要求 返回0     if(k == 1) return 1;      int sum = 0;    for(int t = min; t <= n; t++)    {     sum += solution(n-t, k-1, t);    }    return  sum;}int main(){int h,f;cin>>h>>f;int result=solution(h,f,0);printf("%d\n",result);return 0;}

2.进制转换问题

解析9进制,11进制的字符串为10进制的数字输出
描述: 解析9进制,11进制的字符串为10进制的数字输出,输入的字符串有效位
(0v0012345678)长度不超过8位,前面的00不算做有效位。解析后以10进制的数字输出。如
果解析到非法字符串则返回-1
9进制:
9进制的数的范围:0,1,2,3,4,5,6,7,8
9进制的开始为:0V或者0v
9进制的正确实例:0V11 0v564 0V123 0v0784 0V0 0v 0V
9进制的错误实例:0V923 0vt12 00V21 0123
9进制转换为10进制:0V11  -> 10
0v564  -> 463
11进制:
11进制的数的范围:0,1,2,3,4,5,6,7,8,9,A(a)
11进制的开始为:0W或者0w
11进制的正确实例:0W11 0w564 0W123 0w0A8a 0W 0w
11进制的错误实例:0WB923 0wVaA 00W21 0WAx123
11进制转换为10进制:
0W11  -> 12
0w564  -> 675
输入:
输入为一行9进制或11进制的字符串,格式如上述
输出:
输出为10进制的数字
样例输入:
0w564
样例输出:

675

说明:程序提交正确

#include<iostream>#include<string>#include<cctype>using namespace std;int main(){string str;unsigned long result=0; int flag;cin>>str;if(str.size()>=2){if(str[0]=='0'){if(str[1]=='v'||str[1]=='V')flag=9;else if(str[1]=='w'||str[1]=='W')flag=11;else{cout<<"-1"<<endl;return 0;}}else{cout<<"-1"<<endl;return 0;}}else{cout<<"-1"<<endl;return 0;}if(str.size()>2){for(int i=2;i<str.size();i++){if(9==flag){if((str[i]>'8')||(str[i]<'0')){cout<<"-1"<<endl;return 0;}}if(11==flag){if(!isdigit(str[i])&&(str[i]!='A'&&str[i]!='a')){cout<<"-1"<<endl;return 0;}}}}else{printf("%ld\n",result);return 0;}int temp;for(int i=2;i!=str.size();i++){if(isdigit(str[i]))temp=str[i]-'0';else temp=10;result=result*flag+temp;}printf("%ld\n",result);return 0;}


0 0