【文章內(nèi)容簡介】
leave。 while (scanf(%d %d, amp。n, amp。m) != EOF) { maxv = minv = 0。 for (int i = 0。 i n。 i++) { scanf(%d, v + i)。 maxv += v[i]。 if (v[i] minv) { minv = v[i]。 } } left = minv, right = maxv。 while (left right) { mid = (left + right) / 2。 cunt = 0。 leave = 0。 for (ptr = 0。 ptr n amp。amp。 cunt = m。 ptr++) { if (leave = v[ptr]) { leave = v[ptr]。 } else { leave = mid v[ptr]。 cunt++。 } } if (cunt = m) right = mid。 else left = mid + 1。 } printf(%d\n, left)。 } return 0。}F水晶球 假設(shè)少女的相貌、智慧和財富分別是x、y和z。首先按x從大到小排序處理掉一維,然后建立一個map,它的key值是y,value值是z。然后從頭到尾掃描所有少女。每掃描一個少女時,在map里找其y值的上界,如果它的上界對應(yīng)的z要大于少女的z,則說明有少女無論x、y還是z都大于她。否則將這個少女的y值和z值插入到map里,并且將map里的無用數(shù)據(jù)刪去,無論是y還是z都比少女小的值。當(dāng)然這樣粗略的講,還有很多問題是被忽略過去的,比如說邊界問題,兩個值相同的問題,如何刪去map中的無用數(shù)據(jù)等,這個大家可以參考標(biāo)程。include iostreaminclude cstdioinclude algorithminclude mapusing namespace std。const int maxn = 50005。const int inf = 1000000005。struct Data{ int x, y, z。 // 按x從大到小排,如果x相同,則按y從小到大排,如果y也相同,則按z從小到大排 bool operator (const Data amp。oth) const { if (x != ) return x 。 if (y != ) return y 。 return z 。 }} data[maxn]。int n, ans。mapint, int v。typedef mapint, int::iterator itr。int main(){ int i。 while (scanf(%d, amp。n) != EOF) { for (i = 0。 i n。 i++) scanf(%d, amp。data[i].x)。 for (i = 0。 i n。 i++) scanf(%d, amp。data[i].y)。 for (i = 0。 i n。 i++) scanf(%d, amp。data[i].z)。 ()。 sort(data, data + n)。 v[inf] = inf。 v[inf] = inf。 for (i = 0, ans = 0。 i n。 i++) { itr x = (data[i].y)。 if (data[i].z xsecond) ans++。 else { if (!(data[i].y) || v[data[i].y] data[i].z) {