【ACM】POJ 1852

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/84585902

【问题描述】

一队蚂蚁在一根水平杆上行走,每只蚂蚁固定速度 1cm/s. 当一只蚂蚁走到杆的尽头时,立即从秆上掉落. 当两只蚂蚁相遇时它们会掉头向相反的方向前进. 我们知道每只蚂蚁在杆上的初始位置, 但是, 我们不知道蚂蚁向哪个方向前行. 你的任务是计算所有蚂蚁都杆上掉落可能的最短时间和最长时间.

【输入描述】

第一行包含一个整数,给出测试实例数量. 每组数据开始有两个整数: 杆的长度 (单位:cm) 和杆上蚂蚁数量 n. 之后是 n 个整数给出每只蚂蚁从杆的最左边开始的位置, 且是无序的. 输入的每个整数都不大于 1000000 ,两个数字用空格分开.

【输出描述】

对于每组输入输出两个整数. 第一个整数表示所有蚂蚁从杆上掉落可能的最短时间(如果它们前行方向选择得当) ,第二个整数表示可能的最长时间.

【样例输入】

2
10 3
2 6 7
214 7
11 12 7 13 176 23 191

【样例输出】

4 8
38 207

两个蚂蚁相遇以后如果在调转方向,该过程太过复杂,可以看成两个蚂蚁在相遇以后交换位置(或者可以看成直接沿一个方向走到头)

AC代码一:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1000000+10;

int a[maxn];

int main ()
{
	int T,n,tmin,tmax,i,l,l2;
	scanf("%d",&T);
	while(T--)
	{
		tmin=0;
		scanf("%d%d",&l,&n);
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a,a+n);
		tmax=max(l-a[0],a[n-1]);
		tmin=min(a[0],l-a[0]);
		for(i=1;i<n;i++)
		{
			tmin=max(tmin,min(a[i],l-a[i]));
		}
		printf("%d %d\n",tmin,tmax);
	}
	return 0;
}

AC代码二:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000000;
int small[maxn],big[maxn];

int main()
{
	int t,length,mynum,weizhi,i,j,m;
	scanf("%d",&t);
	while(t--)
	{
		j=0;m=0;
		memset(small,0,sizeof(small));
		memset(big,0,sizeof(big));
		scanf("%d",&length);
		scanf("%d",&mynum);
		for(i=0;i<mynum;i++)
		{
			scanf("%d",&weizhi);
			if(weizhi>length/2)
			{
				big[m++]=weizhi;
				small[j++]=length-weizhi;
			}
			else
			{
				big[m++]=length-weizhi;
				small[j++]=weizhi;
			}
			
		}
		sort(small,small+j);
		sort(big,big+m);
		printf("%d %d\n",small[j-1],big[m-1]);
	} 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/84585902
今日推荐