【买二赠一——二分、贪心(有误)】

题目

二分

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e5 + 10;
bool vis[N];
int a[N];
int two, pos = 1, n;
ll sum;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    sort(a + 1, a + n + 1, greater<int>());
    while (pos <= n)
    {
        if (vis[pos] == 1)
        {
            pos++;
            continue;
        }

        vis[pos] = 1;
        two++;
        sum += a[pos];

        if (two >= 2)
        {
            int l = pos + 1;
            int r = n;
            while (l < r)
            {
                int mid = l + r >> 1;
                if (a[mid] <= a[pos] / 2)
                    r = mid;
                else
                    l = mid + 1;
            }

            if (a[l] <= a[pos] / 2)
            {
                while (vis[l])
                    l++;
                vis[l] = 1;
            }

            two = 0;
        }

        pos++;
    }

    cout << sum;
}

妙用STL

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
long long sum;
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        v.push_back(x);
    }

    sort(v.begin(), v.end());
    while (v.size())
    {
        auto it = prev(v.end());
        int v1 = *it;
        sum += v1;
        if (it == v.begin())
            break;
        int v2 = *prev(it);
        sum += v2;
        v.erase(prev(v.end()));
        v.erase(prev(v.end()));
        auto lower = upper_bound(v.begin(), v.end(), v2 / 2);
        if (lower == v.begin())
            continue;
        v.erase(prev(lower));
    }

    cout << sum;
}
相关推荐
TTGGGFF5 小时前
控制系统建模仿真(四):线性控制系统的数学模型
人工智能·算法
晚风吹长发6 小时前
初步了解Linux中的命名管道及简单应用和简单日志
linux·运维·服务器·开发语言·数据结构·c++·算法
Σίσυφος19006 小时前
Halcon中霍夫直线案例
算法
Anastasiozzzz7 小时前
leetcode力扣hot100困难题--4.俩个正序数列的中位数
java·算法·leetcode·面试·职场和发展
BHXDML7 小时前
第六章:推荐算法
算法·机器学习·推荐算法
Tisfy7 小时前
LeetCode 3510.移除最小数对使数组有序 II:有序集合
算法·leetcode·题解·设计·有序集合
汉克老师8 小时前
GESP2025年9月认证C++五级真题与解析(单选题9-15)
c++·算法·贪心算法·排序算法·归并排序·gesp5级·gesp五级
lihao lihao8 小时前
c++红黑树
算法
Sarvartha8 小时前
递推与递归笔记
算法
TracyCoder1239 小时前
LeetCode Hot100(1/100)——1. 两数之和 (Two Sum)
算法·leetcode