1 solutions
-
0
C++ :
/* author :hzoi_ztx title :奖学金 ALG :二分 comment: [2014 10 15 test] */ #include <cstdio> #include <algorithm> #include <queue> #define maxn 10002 #define maxc 100002 struct pig{ long long a , b , p ; } a[maxc] ; long long n , c ; long long mid = 0 ; long long F ; long long s1 = 0 , s2 = 0 ; long long cc[maxc] = {0} ; bool L[maxc] = {0} ;//记录的都是值排序后的位置 bool R[maxc] = {0} ; bool cmp1(const pig a , const pig b) { return a.b < b.b ; } bool cmp2(const pig a , const pig b) { return a.a > b.a ; } std::priority_queue<long long>q1,q2 ;//大根 int main() { //#define READ #ifdef READ freopen("finace.in" ,"r",stdin ) ; freopen("finace.out","w",stdout) ; #endif long long i , j ; scanf("%lld%lld%lld", &n , &c , &F ) ; for (i = 1 ; i <= c ; i ++ ) scanf("%lld%lld", &a[i].a , &a[i].b ) ; std::sort(a+1 , a+c+1 , cmp1) ; for (i = 1 ; i <= c ; i ++ ) a[i].p = i , cc[i] = a[i].b ; std::sort(a+1 , a+c+1 , cmp2) ; mid = (n>>1)+1 ; for (i = 1 ; i < mid ; i ++ ) { s1 += a[i].b ; q1.push(a[i].p) ; L[a[i].p] = true ; } L[mid] = true ; j = 0 ; for (i = 1 ; i <= c ; i ++ ) { if (L[i]) continue ; //printf("%d\n",i); q2.push(-i) ; if (++j <= mid-1) {s2 += cc[i] ; R[i] = true ;} } //printf("%lld %lld %d\n",s1,s2,a[mid].b) ; if (s1+s2+a[mid].b <= F) { printf("%lld\n",a[mid].a) ; return 0 ; } long long now ; for (i = mid+1 ; i+mid-1 <= c ; i ++ ) { L[a[i].p] = true ; if (a[i-1].p < q1.top()) {//维护左边 s1 -= cc[q1.top()] ; s1 += cc[a[i-1].p] ; q1.pop() ; q1.push(a[i-1].p) ; } if (R[a[i].p]) {//维护右边 s2 -= a[i].b ; R[a[i].p] = false ; while (!q2.empty() && L[-q2.top()]) { q2.pop() ; } s2 += cc[-q2.top()] ; R[-q2.top()] = true ; } if (s1+s2+a[i].b <= F) { printf("%lld\n", a[i].a ) ; return 0 ; } } printf("-1\n") ; return 0 ; }
- 1
Information
- ID
- 17793
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By