1. 程式人生 > >【ACM】POJ 1852

【ACM】POJ 1852

【問題描述】

一隊螞蟻在一根水平杆上行走,每隻螞蟻固定速度 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;
}