제출 #570737

#제출 시각아이디문제언어결과실행 시간메모리
570737vbeeSure Bet (CEOI17_sure)C++14
100 / 100
202 ms7124 KiB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define ii pair<int,int>
#define vii vector<ii>
#define vi vector<int>
#define fi first
#define se second
#define TASK "surebet"
#define ll long long
#define pll pair<ll, ll>
#define vll vector<ll>
#define vpll vector<pll>
#define pb push_back
#define MASK(i) (1 << (i))
#define BIT(x, i) ((x >> (i)) & 1)

using namespace std;

const int oo = 1e9 + 7;
const ll loo = (ll)1e18 + 7;
const int N = 1e5 + 7;

int n;
long double a[N], b[N], res, pre[N], pre2[N];
void trau(int i, vector<int> state){
    if (i == n){
        long double l = 0, r = 0, penalty = 0;
        for (int i = 0; i < state.size(); i++) {
            if (state[i] == 3) penalty -= 2;
            else if (state[i] != 4) penalty--;
        }
        for (int i = 0; i < state.size(); i++) if (state[i] != 4) {
            if (state[i] != 2){
                l += a[i + 1];
            }
            if (state[i] != 1){
                r += b[i + 1];
            }
        }
        res = max(res, min(l, r) + penalty);
        return ;
    }
    for (int j = 1; j <= 4; j++){
        vector<int> newstate = state;
        newstate.pb(j);
        trau(i + 1, newstate);
    }
}
int bs(long double cursum){
    int l = 1, r = n, ret = -1;
    while (l <= r){
        int middle = (r + l) / 2;
        if (pre2[middle] >= cursum) {
            ret = middle;
            r = middle - 1;
        }
        else l = middle + 1;
    }
    return ret;
}
int bs2(long double cursum){
    int l = 1, r = n, ret = -1;
    while (l <= r){
        int middle =  (r + l) / 2;
        if (pre[middle] >= cursum) {
            ret = middle;
            r = middle - 1;
        }
        else l = middle + 1;
    }
    return ret;
}
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
//    freopen(TASK".inp", "r", stdin);
//    freopen(TASK".out", "w", stdout);
    // Nhớ tắt file
    cin >> n;
    for (int i = 1; i <= n; i++){
        cin >> a[i] >> b[i];
    }
    if (n <= 10){
        vector<int> temp;
        trau(0, temp);
        cout << fixed << setprecision(4) << res;
    }
    else if (n <= 1000){
        sort(a + 1, a + 1 + n, greater<long double>());
        sort(b + 1, b + 1 + n, greater<long double>());
        for (int i = 1; i <= n; i++) pre[i] = pre[i - 1] + a[i];
        for (int i = 1; i <= n; i++) pre2[i] = pre2[i - 1] + b[i];
        for (int i = 0; i <= n; i++){
            for (int j = 0; j <= n; j++){
                res = max(res, min(pre[i], pre2[j]) - i - j);
            }
        }
        cout << fixed << setprecision(4) << res;
    }
    else {
        sort(a + 1, a + 1 + n, greater<long double>());
        sort(b + 1, b + 1 + n, greater<long double>());
        for (int i = 1; i <= n; i++) pre[i] = pre[i - 1] + a[i];
        for (int i = 1; i <= n; i++) pre2[i] = pre2[i - 1] + b[i];
        for (int i = 1; i <= n; i++){
            long double cursum = pre[i];
            int numget = bs(cursum);
            if (numget != -1){
                res = max(res, cursum - i - numget);
            }
        }
        for (int i = 1; i <= n; i++){
            long double cursum = pre2[i];
            int numget = bs2(cursum);
            if (numget != -1){
                res = max(res, cursum - i - numget);
            }
        }
        cout << fixed << setprecision(4) << res;
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sure.cpp: In function 'void trau(int, std::vector<int>)':
sure.cpp:29:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         for (int i = 0; i < state.size(); i++) {
      |                         ~~^~~~~~~~~~~~~~
sure.cpp:33:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |         for (int i = 0; i < state.size(); i++) if (state[i] != 4) {
      |                         ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...