廈理OJ——1003:第三屆程式設計大賽 讓氣球飛起來
一、題目
Description
比賽又一次開始了,看著氣球漂浮在周邊是多麼興奮的事情啊,但是告訴你一個祕密,裁判最喜歡做的事情就是猜一個問題,即數目最多的氣球顏色。當比賽結束時,他們會數每種顏色的氣球數目並公佈結果。今年,他們決定將數氣球的事情交給你做。
Input
測試資料第一行是一個N(0 < N <= 100),表示放飛的氣球總數;緊接著的N行中每行表示一種氣球顏色。每種氣球顏色是由不多於15個小寫字母組成。
Output
對於每組測試資料,對應一行輸出顏色最多的氣球顏色,測試資料能保證對應的結果唯一。
Sample Input
5 green red blue red red
Sample Output
red
二、解析
本題的思路非常簡單,只要讀顏色,讀到之前讀過的顏色那麼個數就加一。但是在程式的設計上可能會有點複雜。
對於這個思路,我們先定義一個結構體BLN(還沒學結構體的可以看下面另一種思路),引數包括字串變數color和整型變數num,很容易看出這是用來相同顏色氣球計數的,由於N的最大值為100,所以我們先建立個數為100的balloon變數用於計數。
接著對每個顏色分別進行讀取,每讀取一總顏色就遍歷已有顏色,若已含有該顏色,則將該顏色數量加一,即BLN結構體中num值。若不存在,則新建該顏色,並將數量賦值為1。
在將所有顏色遍歷完後,再對所有顏色的數量進行比較,輸出最大數對應的顏色。
可能有人還沒學過結構體,所以這裡再用C風格字串(字串都還沒學過的可以跳過這題了QAQ)做一個解題思路,程式碼未給出。
首先解題的大致思路還是一樣的,只是變數的設定發生變化,我們需要建立一個字串陣列char *color[100]和整型的陣列int num[100]作用和之前的結構體一樣,只要將讀入的顏色儲存在color裡,當讀到重複的顏色是我們可以得到這個顏色在color中對應的角標,假設為i,那我們將num[i]進行加一就可以起到計數的效果,直到所有顏色讀完,找出num中最大的數,同樣得到角標j,輸出color對應的顏色color[j]即可。
三、原始碼
#include <iostream> #include <string>//在C語言中不能使用 可以使用char* 定義字串 //C語言 //#include <stdio.h> //#include <string.h> using namespace std; struct BLN { string color;//char *color; int num; }; int main_1003() { BLN balloon[100]; //顏色計數結構體 int color_num = 0; //顏色數量 bool IS_have_color = false; //是否有相同顏色 int N; cin >> N;//scanf("%d",&N); for (int i = 0; i < N; i++) { //讀取每一個顏色 string color_in;//char *color_in; cin >> color_in;//scanf("%s",&color_in); //遍歷已有顏色 for (int j = 0; j < color_num; j++) { if (balloon[j].color == color_in) { balloon[j].num++; IS_have_color = true; break; } } //若顏色不存在 則新建顏色 if (!IS_have_color) { balloon[color_num].color = color_in; balloon[color_num].num = 1; color_num++; } IS_have_color = false; } int num_out = 0; //迴圈遍歷每個顏色個數 輸出最大的顏色 for (int i = 0; i < color_num; i++) { num_out = balloon[i].num > balloon[num_out].num ? i: num_out; } cout << balloon[num_out].color;//printf("%s",balloon[num_out].color); return 0; }
四、深入研究
emmm還沒想好