洛谷 P1007 獨木橋 (set集合的應用實例)—— C++

題目描述
突然,你收到從指揮部發來的信息,敵軍的轟炸機正朝着你所在的獨木橋飛來!爲了安全,你的部隊必須撤下獨木橋。
已知 獨木橋的長度爲 L ,士兵們只能呆在座標爲整數的地方。所有士兵的速度都爲 1 ,當一個士兵某一時刻來到了座標爲 0 或 L+1 的位置,他就離開了獨木橋。

每個士兵都有一個初始面對的方向,他們會以勻速朝着這個方向行走,中途不會自己改變方向。但是,如果兩個士兵面對面相遇,他們無法彼此通過對方,於是就分別轉身,繼續行走。(轉身不需要任何的時間)

因爲混亂,你已不能控制你的士兵。甚至,你連每個士兵初始面對的方向都不知道。此時,你想要知道你的部隊最少需要多少時間就可以全部撤離獨木橋。另外,總部也在安排阻攔敵人的進攻,因此你還需要知道你的部隊最多需要多少時間才能全部撤離獨木橋。

輸入格式
第一行:一個整數 L ,表示獨木橋的長度。橋上的座標爲 1… L

第二行:一個整數 N,表示初始時留在橋上的士兵數目

第三行:有 N個整數,分別表示每個士兵的初始座標。

輸出格式
只有一行,輸出 2 個整數,分別表示部隊撤離獨木橋的最小時間和最大時間。2 個整數由一個空格符分開。

輸入輸出樣例
輸入

4
2
1 3

輸出

2 4

說明/提示
初始時,沒有兩個士兵同在一個座標。

數據範圍 N ≤ L ≤ 5000。

思路:有一個很巧妙的轉化:兩個人面對面相遇後分別轉身,相當於都沒有轉身,用對方的身份走下橋

簡單代碼

#include <iostream>
#include<algorithm>
using namespace std;
int main() {
	int l, n;
	while (cin >> l >> n) {
		int x;
		int M = 0, m = 0;
		for (int i = 1; i <= n; i++){
			cin >> x;
			m = max(min(l + 1 - x, x), m);//所有士兵走下橋所需時間最小值中的最大值
			M = max(max(l + 1 - x, x), M);//所有士兵走下橋所需時間最大值中的最大值
		}
		cout << m << ' ' << M << endl;
	}
}

set() 應用代碼

#include<iostream>
#include<set>
using namespace std;

//set<int>mins,maxs;實現從小到大排序
set<int, greater<int> >mins,maxs;//實現從大到小排序 

int minlen(int l, int x){
	return x > l + 1 - x ? l + 1 - x : x;
}
int maxlen(int l, int x) {
	return x > l + 1 - x ? x : l + 1 - x;
}

int main() {
	int l; cin >> l;
	int n; cin >> n;
	int x;
	
	for (int i = 0; i < n; i++) {
		cin >> x;
		mins.insert(minlen(l, x));
		maxs.insert(maxlen(l, x));
	}
	
	//對於從小到大的 set 
	// mins.end() 中存放的是該容器的 size() ,而不是最大元素
	set<int>::iterator themin= mins.begin();
	set<int>::iterator themax= maxs.begin();
	cout << *themin << " " << *themax << endl;
	
	system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章