• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
\0\0\0
博客园    首页    新随笔    联系   管理    订阅  订阅
蓝桥杯历届试题——蚂蚁感冒
问题描述
  长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
 
 直接模拟过程即可
 
#include <iostream>
#include <cmath>
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

#define maxint  10000

// 蚂蚁个数 
int ants = 0;
float ant[50];
bool sick[50];
int sicks = 1;

int PARTITION(int i, int j)
{
	float x = ant[j];
	int a = i;
	for(int y = i; y < j;y++)
	{
		if(abs(ant[y]) < abs(x))
		{
			// exchange
			if(a != y) 
			{
				float m = ant[a];
				ant[a] = ant[y];
				ant[y] = m;
			}
			a++;
		}
	}
	// put it in the middle 
	float m = ant[a];
	ant[a] = ant[j];
	ant[j] = m;
	return a;
}


void QUICKSORT(int i, int j)
{
	// 快排
	if( j > i)
	{
		int q = PARTITION(i,j);
		QUICKSORT(i, q - 1);
		QUICKSORT(q + 1, j);
	}
}

int main(int argc, char *argv[]) {
	// 输入 
	cin>>ants;
	for(int i = 0; i < ants; i++)
	{
		cin>>ant[i];
	}
	for(int i =0; i < 50; i++)
	{
		sick[i] = false;
	}
	int sickant = ant[0];
	// 暴力破解法
	// 排序 
	QUICKSORT(0, ants - 1);
	for(int i = 0; i < ants; i++)
	{
		if(ant[i] == sickant)
		{
			sick[i] = true;
			break;
		}
	}
	// find the min
	int leftants = ants;
	int antsbegin = 0;
	int antsend = ants - 1;
	
	float leftout = maxint;
	float rightout = maxint;
	float mincollide = maxint;
	while(leftants > 0)
	{
		// left ant move
		if(ant[antsbegin] < 0)
		{
			leftout = -ant[antsbegin];
		}
		else 
		{
			leftout = maxint;
		}
		// right ant move
		if(ant[antsend] > 0)
		{
			rightout = 100 - ant[antsend];
		}
		else
		{
			rightout = maxint;
		}
		// ants collide
		mincollide = maxint;
		int mini = 0;
		for(int i = antsbegin; i < antsend; i++)
		{
			if(ant[i] >0 && ant[i+1] < 0 && abs(ant[i] + ant[i+1]) * 1.0 / 2 < mincollide)
			{
				mini = i;
				mincollide = abs(ant[i] + ant[i+1]) * 1.0/2;
			}
		}
		// compair
		if(mincollide <= leftout && mincollide <= rightout)
		{
			if((sick[mini] || sick[mini + 1]) && !(sick[mini] & sick[mini+1]))
			{
				sick[mini] = true;
				sick[mini + 1] = true;
				sicks++;
			}
			for(int i = antsbegin; i <= antsend; i++)
			{
				ant[i] = ant[i] + 1;
				if(i == mini || i == mini + 1)
				{
					ant[i] = -ant[i];
				}
			}
			if(ant[antsbegin] <= 0 && ant[antsbegin] >= -0.001) 
			{
				antsbegin++;
				leftants--;
			}
			if(ant[antsend] > 0 && 100 - ant[antsend] <= 0.001)
			{
				antsend--;
				leftants--;
			}
		}
		else if(leftout < mincollide && leftout <= rightout)
		{
			antsbegin++;
			leftants--;
			for(int i = antsbegin; i < antsend; i++)
			{
				ant[i] += leftout;
			}
			if(ant[antsend] > 0 && 100 - ant[antsend] <= 0.001)
			{
				antsend--;
				leftants--;
			}
		}
		else if(rightout < leftout)
		{
			antsend--;
			leftants--;
		}
	}
	cout<<sicks<<endl;
	return 0;
}

  

此博客主要是个人记录
posted on 2015-04-08 14:42  \0\0\0  阅读(277)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3