1. 程式人生 > >ACM/HDU1006 Let the Balloon Rise,讓氣球上升

ACM/HDU1006 Let the Balloon Rise,讓氣球上升

Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges’ favorite time is guessing the most popular problem. When the contest is over, they will count the balloons of each color and find the result.

思路: 用a陣列記錄不同的單詞,b陣列記錄該單詞的出現次數,每輸入一個單詞進行一次判斷,如果a中沒這個單詞,則a中新增這個單詞,如果已經出現過,那麼對應的b[i]加1。 優點:

和其他進行多次迴圈,巢狀迴圈的方法相比,每次輸入完進行判斷,輸入完畢便直接輸出的效率顯然更高~~也是剛剛做完,歡迎大家給予建議。acm/HDU,程式碼可AC。

#include<stdio.h>
#include<string.h>
int max(int a,int b) //比較兩個數大小,返回大的值 
{
	if(a<b)return b;
	else return a;
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n!=0) //輸入N個數,0結束 
	{
	char a[1000][15]={0};     /*陣列a[i]儲存不同的單詞,由於迴圈,進行初始化
								注意a[i]並不是輸入,是判斷為不同的單詞才儲存 */
	int b[1000]={0},now,i,m,m_i; /*用b[i]陣列記錄第a陣列中第i個單詞出現的次數。由於迴圈,進行初始化。 
								 	now是當前不同單詞的數目,表示到現在共有now個不同的單詞 
								 	m為用自定義函式max比較後,到目前輸入為止
								 	重複最多單詞的次數,m_i為該單詞在a[i]
									與b[i]對應的角標i*/
	now=0;			//初始化now 
	while(n--)		//輸入N個單詞 ,每輸入一個單詞,進行一次全面判斷,如下: 
	{
		char sc[15];
		scanf("%s",sc);   //輸入一個單詞 
		if(now==0)				 //如果這是第一個單詞,那麼一定不重複,
		{					
			strcpy(a[now],sc);		//a中新增這個單詞
			b[now]=1;				//b中該單詞出現次數初始化為1 
			now+=1;					//不重複單詞個數加1 
			m=b[now];				//最大次數為當前該單詞個數; 
			m_i=now;				//最大出現次數的角標為當前角標 
		}
		for(i=0;i<now;i++)			//每輸入一個單詞,讓該單詞與a這個表示不重複單詞陣列進行比較 
		{
			if(strcmp(sc,a[i])!=0&&(i+1)==now)  //如果該單詞與a陣列中所有單詞都不相同 
			{
				strcpy(a[now],sc);				//a中新增這個單詞; 
				b[now]=1;						//該單詞出現次數初始化為1; 
				now+=1;							//單詞總數加1,準備下一次迴圈使用; 
			}
			else if(strcmp(sc,a[i])==0)			//如果輸入單詞在a中已經存在 
			{
				b[i]+=1;							//該單詞的個數加1 
				m=max(b[i],m);						//比較當前單詞出現次數加完1後,和原先出現最多的相比,哪個次數更多。 
				if(m==b[i]) m_i=i;					//如果該單詞出現更多,那麼角標變為當前角標,否則保持原樣 
			}
		}
	}
	printf("%s\n",a[m_i]);			//輸出角標為m_i的該單詞。 
}
}

覺得可以優化的地方,歡迎大家留言!