期末预测之最佳阈值

用前缀和求解

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    pair<int, int>p[100020];
    int a, b;
    for (int i = 1; i <= n; i++) {
        cin >> a >> b;
        p[i]=make_pair(a, b);
    }
    int max_size = 0;
    int index = 0;
    sort(p+1, p + n+1);
    int sum[100020] = { 0 };
    for (int i = 1; i <= n; i++) {
        sum[i] = sum[i - 1] + p[i].second;
    }set<int>st;
    int f1 = 0, f2 = 0, f = 0;
    for (int i = 1; i <= n; i++) {
        a = p[i].first;//选取阈值 
        if (st.count(a)) continue;//set去重 
        st.insert(a);
        f2 = sum[n] - sum[i-1];
        f1 = i - 1 - sum[i - 1];
        f = f1 + f2;
        if (max_size <= f) {
            max_size = f;
            index = i;
        }
    }
    cout << p[index].first;
    return 0;
}

二刷

#include<bits/stdc++.h>
using namespace std;
int m;
pair<int, int>p[100010];
int d[100010] = { 0 };
int sum[100010] = { 0 };
bool cmp(pair<int,int> a, pair<int,int> b) {
    if (a.first != b.first) {
    return a.first < b.first;
    }
    else {
        return a.second < b.second;
    }
}
int main() {
    cin >> m;
    int i;
    for (i = 1; i <= m; i++) {
        cin >> p[i].first >> p[i].second;
    }
    sort(p+1, p +1+ m, cmp);
    for (i = 1; i <= m; i++) {
        d[i] = p[i].second;
        sum[i] = sum[i - 1] + d[i];
    }
    set<int>s;
    int max_sum = 0;
    int max_i = 0;
    for (i = 1; i <= m; i++) {
        int f1 = 0, f2 = 0, f = 0;
        int a = p[i].first;
        if (s.count(a))continue;
        s.insert(a);
        f1 = i - sum[i - 1]-1;
        f2 = sum[m] - sum[i - 1];
        f = f1 + f2;
        if (max_sum <= f) {
            max_sum = f;
            max_i = i;
        }
    }
    cout << p[max_i].first;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值