Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
错误的代码也能通过!!!3 4 200 1 1 2 2 3 201 4 4 ----------------------- #include <iostream> #include <algorithm> using namespace std; #define MAX_COW 100000 + 100 int N, C, F; int lower[MAX_COW], upper[MAX_COW]; struct Cow { int rank_by_score, score, aid; }; Cow cow_score[MAX_COW], cow_aid[MAX_COW]; bool less_by_score(Cow& a, Cow& b) { return a.score < b.score; } bool less_by_aid(Cow& a, Cow& b) { return a.aid < b.aid; } ///////////////////////////SubMain////////////////////////////////// int main(int argc, char *argv[]) { ios::sync_with_stdio(false); cin.tie(0); cin >> N >> C >> F; int half = N / 2; for (int i = 0; i < C; ++i) { cin >> cow_score[i].score >> cow_score[i].aid; // 分数 学费 } sort(cow_score, cow_score + C, less_by_score); for (int i = 0; i < C; ++i) { cow_score[i].rank_by_score = i; } memcpy(cow_aid, cow_score, sizeof(Cow) * C); sort(cow_aid, cow_aid + C, less_by_aid); int lb = 0, ub = C, ans = -1; while (ub - lb > 1) { int mid = (ub + lb) >> 1; // 将牛分为左右两个区间,统计左区间符合条件的数目left和右区间的数目right // 情况比较多,总体是二分,实际上有四种情况 int left = 0, right = 0, total_aid = cow_score[mid].aid; for (int i = 0; i < C; ++i) { if ((cow_aid[i].rank_by_score < mid) && (total_aid + cow_aid[i].aid <= F) && (left < N / 2)) { total_aid += cow_aid[i].aid; ++left; } else if ((cow_aid[i].rank_by_score > mid) && (total_aid + cow_aid[i].aid <= F) && (right < N / 2)) { total_aid += cow_aid[i].aid; ++right; } } // 四种情况 if ((left < N / 2) && (right < N / 2)) { ans = -1; break; } else if (left < N / 2) { lb = mid; } else if (right < N / 2) { ub = mid; } else { ans = cow_score[mid].score; lb = mid; } } cout << ans << endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator