洛谷1007
- 题意:
敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,
你的部队必须撤下独木桥。独木桥的长度为LL,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为11,但一个士兵某一时刻来到了坐标为00或L+1L+1的位置,他就离开了独木桥。每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,
中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,
于是就分别转身,继续行走。转身不需要任何的时间。由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。
因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。
另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。 - 解题思路:
那么当两个士兵撞在一起时,从从平行视角看他们都掉头,但从高空俯视,会发现他们“穿过”了对方。换言之,这与他们相互穿过并没有任何区别。
然这样就可以把士兵分开。比方说有一个士兵在位置3,开始时向右,那么一定有一个士兵在两秒后在位置5。虽然可能不是同一个人,但由于士兵都是相同的,我们可以认为他们相同。
首先,我们把他们一个个读进去。然后,对于每一个士兵,他有向左和向右两种选择。设士兵在位置p,如果向左,需要p时间单位;向右,需要L-p+1个。分别取max和min,将其存储在max和min数组中。
最小值:既min数组中的最大值
最大值:既max数组中的最大值
临界条件:当桥上没有士兵时,最大最小时间都为0 - 代码
1 #include<iostream> 2 #include<stdio.h> 3 #define Max 10000 4 using namespace std; 5 int main() 6 { 7 int L; 8 int n; 9 int soilder[Max]; 10 cin >> L; 11 cin >> n; 12 if (!n) //桥上没人时 13 { 14 cout << "0 0"; 15 return 0; 16 } 17 int located; 18 for (int i = 0; i < n; i++) 19 { 20 cin >> located; 21 soilder[i] = located; 22 } 23 int max[Max]; 24 int min[Max]; 25 for (int i = 0; i < n; i++) 26 { 27 if (soilder[i] < (L - soilder[i] + 1)) 28 { 29 max[i] = L - soilder[i] + 1; 30 min[i] = soilder[i]; 31 } 32 else 33 { 34 min[i] = L - soilder[i] + 1; 35 max[i] = soilder[i]; 36 } 37 } 38 int min_t=-1; 39 int max_t=-1; 40 for (int i = 0; i < n; i++) 41 { 42 if (min_t < min[i]) 43 min_t = min[i]; 44 } 45 for (int i = 0; i < n; i++) 46 { 47 if (max_t < max[i]) 48 max_t = max[i]; 49 } 50 cout << min_t <<' '<< max_t; 51 return 0; 52 }

浙公网安备 33010602011771号