description
有個腦筋急轉彎是這樣的:有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是:因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算「淹了兩次」。舉例說明:
假定高橋和低橋的高度分別是5和2,初始水位為1
第一次洪水:水位提高到6(兩個橋都被淹),退到2(高橋不再被淹,但低橋仍然被淹)
第二次洪水:水位提高到8(高橋又被淹了),退到3。
沒錯,文字遊戲。關鍵在於「又」的含義。如果某次洪水退去之後一座橋仍然被淹(即水位不小於橋的高度),那麼下次洪水來臨水位提高時不能算「又」淹一次。
輸入n座橋的高度以及第i次洪水的漲水水位ai和退水水位bi,統計有多少座橋至少被淹了k次。初始水位為1,且每次洪水的漲水水位一定大於上次洪水的退水水位。
input
輸入檔案最多包含25組測試資料。每組資料第一行為三個整數n, m, k(1<=n,m,k<=105)。第二行為n個整數hi(2<=hi<=108),即各個橋的高度。以下m行每行包含兩個整數ai和bi(1<=bibi-1)。輸入檔案不超過5mb。
output
對於每組資料,輸出至少被淹k次的橋的個數。
sample input
2 2 2
2 56 2
8 35 3 2
2 3 4 5 6
5 34 2
5 2
sample output
case 1: 1
case 2: 3
核心思想假設潮的漲幅無限大,從潮的起點往後都加一,從潮的最大漲幅往後都減一,如果橋高度在潮的起到最大這段區間,即為被淹一次。
為了優化**,避免for的巢狀,只需區間開頭++,末尾--。查詢時從區間開始往後累加即為橋被淹沒的次數。
stl 中的 lower_bound(),
函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置
舉例如下:
乙個陣列number序列為:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos為要插入的位置的下標
則pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。
所以,要記住:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!!~
#include#include#include#includeusing namespace std;
int h[1000005];
int f[1000005];
int main()
sort(h,h + n);
int s = 1,t;
int up,dwn;
for(int i = 0;i < m;i++)
int ss = 0,res = 0;
for(int i = 0;i < n;i++)
printf("case %d: %d\n",kase++,res);
}return 0;
}
高橋和低橋 CSU 1335
有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩次 舉例說明 假定高橋和低橋的高度分別是5和2,初始水位為1 第一次洪水 水位提高到6 兩個橋都被淹 退到2 高橋...
高橋和低橋 CSU 1335
高橋和低橋 csu 1335 time limit 1000 ms memory limit 131072 kb 有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩...
CSU1335 高橋和地橋
proble 有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩次 舉例說明 假定高橋和低橋的高度分別是5和2,初始水位為1 第一次洪水 水位提高到6 兩個橋都被淹...