2014 華爲編程賽

第一輪:

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章