首页 > 其他分享 >贪心

贪心

时间:2023-03-18 14:56:57浏览次数:25  
标签:const int res heap using include 贪心

六、贪心

没有思路的话,先排序。选择当前最好的情况来进行下去。

1.区间分组
image-20230318104319886
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>//使每组内部区间不相交,按左端点从小到大排序
using namespace std;//从前往后处理每个区间,判断能否将其放到某个现有的组中。L[i]>Max_r。最大值
const int N = 100010;//如果不存在这样的组,则开新组,然后在将其放进去。
int n;//如果存在这样的组则将其放进去,并更新当前组
struct Range
{
    int l,r;
    bool operator< (const Range &W)const
    {
        return l<W.l;
    }
}range[N];
int main()
{
    scanf("%d", &n);
    for(int i=0;i<n;i++) 
    {
        int l,r;
        scanf("%d%d",&l,&r);
        range[i]={l,r};
    }
    
    sort(range,range+n);
    priority_queue<int, vector<int>, greater<int>> heap;//优先队列,小根堆
    for(int i=0;i<n;i++)
    {
        auto r= range[i];
         if (heap.empty() || heap.top() >= r.l) heap.push(r.r);
        else
        {
           heap.pop();
            heap.push(r.r);
        }
        
    }
    printf("%d\n",heap.size());
    return 0;
    
}
2.huffman树,合并果子

最小的两个点深度一定最深,且可以互为兄弟

image-20230318111904066
image-20230318111945120
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;//开个优先队列,每次合并最小的两个点
int main()
{
    int n;
    cin>>n;
      priority_queue<int, vector<int>, greater<int>> heap;//定义一个名为heap的小根堆
      while (n -- )
      {
          int n;
          cin>>n;
          heap.push(n);//依序插入果子堆
          
      }
      int res=0;
      while(heap.size()>1)//当还没有只剩一个堆时
      {
          int a=heap.top();heap.pop();//取第一个小值
          int b=heap.top();heap.pop();//取第二小值
          int c=b+a;//合并前两个小的
          res=res+c;
          heap.push(c);
      }
      cout<<res<<endl;
    return 0;
}
3.排序不等式(排队打水)
image-20230318141019427

从小到大排序

#include <iostream>
#include <cstring>//从小到大排序,总时间最小,最小的权值最大,则排在最低处
#include <algorithm>
using namespace std;
const int N = 100010;
typedef long long LL;
int main()
{
    LL res=0;
    int n;
    int a[N];
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    sort(a,a+n);
    for(int i=0;i<n;i++) res+=a[i]*(n-i-1);
    printf("%lld\n",res);
    return 0;
}
4.绝对值不等式,货仓选址
image-20230318141228455
#include <iostream>//放中间最好,中位数
#include <cstring>
#include <algorithm>
const int N = 100010;
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[N];
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    sort(a,a+n);
    int res=0;
    for(int i=0;i<n;i++) res+=abs(a[i]-a[n/2]);//每一个减去中位数取绝对值找距离
    cout<<res<<endl;
    return 0;
}
5.推公式,耍杂技的牛
image-20230318142750770 image-20230318142813670
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;//按照wi+si从小到大的顺序排,最大的危险系数一定是最小的
typedef long long ll;
typedef pair<int, int> PII;
const int N = 5e4 + 5;
PII a[N];
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i ++ )
    {
        int x, y;
        scanf("%d %d", &x, &y);
        a[i].first = x + y;
        a[i].second = y;
    }
    sort(a, a + n);
    ll res = -1e18, sum = 0;
    for(int i = 0; i < n; i ++ )
    {
        sum -= a[i].second;
        res = max(res, sum);
        sum += a[i].first;
    }
    cout << res << endl;
    return 0;
}

标签:const,int,res,heap,using,include,贪心
From: https://www.cnblogs.com/Cathy-cat/p/17230606.html

相关文章

  • 剑指Offer49 -- DP/贪心
    1.题目描述丑数2.思路很明显,丑数就是\(2,3,5\)的乘积组合。最一开始,我竟然傻傻的\(dfs\)+\(set\)来求解,其实仔细想想,\(dfs\)肯定是不行的,因为\(dfs\)会......
  • 【LeetCode贪心#08】根据身高重建队列(还是涉及处理两个维度的信息)
    根据身高重建队列力扣题目链接(opensnewwindow)假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表......
  • 【LeetCode贪心#07】分糖果
    发糖果力扣题目链接(opensnewwindow)老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些......
  • 【LeetCode贪心#06】加油站(股票买卖变种)
    加油站力扣题目链接(opensnewwindow)在一条环路上有N个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油......
  • 第六章 贪心一
    第六章贪心一区间问题区间选点给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点......
  • 【LeetCode贪心#03】最大子序和
    最大子序和力扣题目链接给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输......
  • AcWing100 -- 差分 & 贪心
    1.题目描述题目给定我们一个数组,我们每次可以对数组的一段区间加一或者减一,问我们,使得序列所有数字相等的最少操作次数以及方案个数2.思路很容易想到差分,将题目转......
  • The Very Beautiful Blanket (贪心给问题增加限制条件,构造,位运算)
        法一:贪心得缩小调价:让每一个矩阵的值都是一样的性质:  捞捞利用位运算的性质,每次+4,因为4是二ni次,就是一直在某个位上面加一个东西然后在第......
  • CF21804D Accommodation (贪心,特别注意这个实现过程,减法思维)
        别人的思路;  对于第一个问题求最小:尽可能让连续的2个1放一个房间就行,最多m/4对于第二个问题:尽可能让不是11连续的位置为double公寓,因为每有2个......
  • C - Choosing flowers(贪心)
    题目https://codeforces.com/contest/1379/problem/C题意输入t(≤1e4)表示t组数据。所有数据的m之和≤1e5。每组数据输入n(≤1e9)m(≤1e5)表示有m种......