【ACM】POJ 1852
阿新 • • 發佈:2018-11-29
【問題描述】
一隊螞蟻在一根水平杆上行走,每隻螞蟻固定速度 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; }