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

题目

二分

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;
}
相关推荐
wuqingshun3141593 分钟前
蓝桥杯17. 机器人塔
c++·算法·职场和发展·蓝桥杯·深度优先
图灵科竞社资讯组34 分钟前
图论基础:图存+记忆化搜索
算法·图论
chuxinweihui1 小时前
数据结构——栈与队列
c语言·开发语言·数据结构·学习·算法·链表
爱编程的鱼1 小时前
C# 结构(Struct)
开发语言·人工智能·算法·c#
啊我不会诶1 小时前
CF每日4题
算法
uhakadotcom2 小时前
人工智能如何改变医疗行业:简单易懂的基础介绍与实用案例
算法·面试·github
山北雨夜漫步3 小时前
机器学习 Day14 XGboost(极端梯度提升树)算法
人工智能·算法·机器学习
到底怎么取名字不会重复3 小时前
Day10——LeetCode15&560
c++·算法·leetcode·哈希算法·散列表
chuxinweihui3 小时前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
freexyn4 小时前
Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
笔记·算法·matlab