藍橋杯螞蟻感冒問題

今天閒來無事,整理了一下參加藍橋杯算法競賽的題目,記得當時其中有一道是螞蟻感冒的問題,原題如下:

//藍橋杯  螞蟻感冒問題:
/*
標題:螞蟻感冒


    長100釐米的細長直杆子上有n只螞蟻。它們的頭有的朝左,有的朝右。 


    每隻螞蟻都只能沿着杆子向前爬,速度是1釐米/秒。


    當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。


    這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。


    請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。




【數據格式】


    第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。


    接着的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,數據中不會出現0值,也不會出現兩隻螞蟻佔用同一位置。其中,第一個數據代表的螞蟻感冒了。


    要求輸出1個整數,表示最後感冒螞蟻的數目。


例如,輸入:
3
5 -2 8
程序應輸出:
1


再例如,輸入:
5
-10 8 -20 12 25
程序應輸出:
3


資源約定:
峯值內存消耗 < 256M
CPU消耗  < 1000ms




請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。


所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。


注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。


提交時,注意選擇所期望的編譯器類型。


*/   我整理的代碼,跑例子沒問題,具體答案我不知道,把研究的結果記錄一下:

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct Node
{
	int flag;  // 1 表示向右,0 表示向左 
	int width;  // 表示螞蟻距離左邊的距離
	bool ganmao; // true 表示螞蟻感冒了,false 表示沒有感冒 
}Node;
Node* mayi;
//  求所有向左的螞蟻中距離左端距離的最大值
// 和所有向右的螞蟻中距離左端的最小值 
bool operator <( Node a,Node b)  // 根據width sort 
{
	if(a.width<=b.width)
		return true;
	else
		return false;
}
int getMaxZuo(int n,int&min)
{
	int max=0;
	min=100;
	for(int i=0;i<n;i++)
	{
		if(mayi[i].flag==0&& mayi[i].width>max)
			max=mayi[i].width;
		if(mayi[i].flag==1&& mayi[i].width<min)
			min=mayi[i].width;
	}
	return max;
}
// 打印所有的螞蟻情況

 void Print(int n)
 {
	for(int i=0;i<n;i++)
	{
		cout<<"flag"<<mayi[i].flag<<"  width:"<<mayi[i].width<<"  ganmao:"<<mayi[i].ganmao<<endl;
	}
} 
// 得到所有感冒的螞蟻的數量 
int ALLGanmao(int n)
{
	int max,min;
	int countganmao=1; 
	max=getMaxZuo(n,min);
	
	//cout<<"max:"<<max<< "  min:"<<min<<endl;
	while(max>min)  // 只有當向左的螞蟻中的距離左端最大值 小於所有向右的螞蟻中的最小值時程序截止 
	{
		//cout<<"max:"<<max<< "  min:"<<min<<endl;
		for(int i=0;i<n;i++)
		{
			if(mayi[i].flag==0)  // 向左
			 	mayi[i].width--;
			else
				mayi[i].width++;
		} 
		for(int j=0;j<n-1;j++)
		{
			if(mayi[j].width==mayi[j+1].width)  // 代表螞蟻碰頭
			{
				int t=mayi[j].flag;
				mayi[j].flag=mayi[j+1].flag;  // 首先方向對調 
				mayi[j+1].flag=t;
				if(mayi[j].ganmao!=mayi[j+1].ganmao)  // 如果兩隻螞蟻的感冒狀態不一致、
				{
					 countganmao++; 
					 mayi[j].ganmao=true;
					 mayi[j+1].ganmao=true;  //  都要感冒!!!!  傳染 
				}
			} 
		}
		cout<<"這次所有螞蟻的狀態是:***********"<<endl; 
		Print(n);
		cout<<"***********************"<<endl;
		max=getMaxZuo(n,min);  //  狀態改變後再次判斷程序是否可以截止 
	}
	return countganmao;
} 
int main()
{
	int n;
	cin>>n;
	mayi=new Node[n];
	for(int i=0;i<n;i++)
	{
		int m;
		cin>>m;
		if(i==0)
			mayi[i].ganmao=true;
		else
		 	mayi[i].ganmao=false;
		if(m>0)
		{
			mayi[i].flag=1;
			mayi[i].width=m;
		}
		else
		{
			mayi[i].flag=0;
			mayi[i].width=-m;
		}
		
	}
	sort(mayi,mayi+n);
	Print(n);
	cout<<"all ganmao is:"<<ALLGanmao(n)<<endl; 
	system("pause");
	return 0;	
}
運行例子的結果截圖:



發佈了47 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章