首页 > 其他分享 >4.24 贪心法学习笔记

4.24 贪心法学习笔记

时间:2023-04-24 21:37:51浏览次数:48  
标签:const int 线段 len 笔记 include 4.24 贪心

多写题解多交流才能学好 oi。

在这里贴了代码,为了看上去完整一些。

 


大概是一些自己学习的记录罢。

贪心不算客观意义上的算法,感觉还不算一种策略机制。我认为更像一种思路,其内涵就是择优,解题时就去想怎样才能更优。

根据最优的思路能去做很多,如果说贪心是一个题的正解的话太抽象,因此贪心的重点也是在证明。

一般证明可以用反证法。

有时不能验证正确性,也可以适当骗分。

感觉贪心蛮好玩的,挺考察思维能力。

 


 

经典题:

1.syoj.1501 最多不相交线段。P1803 凌乱的yyy / 线段覆盖

 

这个就是找到最多的不相交线段条数。答案是考虑按照右端点从小到大排序,最大限度的向左边缩,不要往右边伸展,然后用这个选定的线段将不符合条件的线段筛掉。即一个点既然能被一条线段覆盖,那就让这条线段尽量的短。

但在 syoj 上会卡奇奇怪怪的东西,输入的时候注意判断一下 l 和 r,右边的不一定比左边大。

 

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 10;
int n, ans;
int vis[N];
struct node{int a, b;} k[N];
bool cmp(node x, node y)
{
    return x.b < y.b;
}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++ )
    {
        scanf("%d%d", &k[i].a, &k[i].b);
        if(k[i].b < k[i].a) swap(k[i].a, k[i].b);
    }
    sort(k + 1, k + n + 1, cmp);
    for(int i = 1; i <= n; i ++ )
    {
        if(!vis[i])
        {
            ans ++;
            vis[i] = 1;
            for(int j = i + 1; j <= n; j ++ )
            {
                if(k[i].b > k[j].a) vis[j] = 1;
            }
        }
    }
    printf("%d", ans);
    return 0;
}

 

 

2. syoj.1502 区间最少覆盖线段 AcWing 907.区间覆盖

思路和上面那个一模一样吧。按左端点从大到小排序,尽可能的向右延伸。每个点,若有两条线段覆盖,一定找右端点更靠右的那条。

 

#include<iostream
#include<algorithm>
using namespace std;
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(){
    int st,ed;
    scanf("%d%d",&st,&ed);//start end
    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);
    int res=0,success=0;
    for(int i=0;i<n;i++){
        int j=i,r=-2e9;
        while(j<n&&range[j].l<=st){//只要这个区间可以覆盖 
            r=max(r,range[j].r);//右边的端点最能靠右 
            j++;//一直往后找区间 
        }
        if(r<st){//结果找了一遍都不能覆盖到 
            res=-1;//那就说明无解 
            break;
        }
        res++;
        if(r>=ed){//说明找到咧 
            success=1;
            break;
        }
        st=r;
        i=j-1;//这之前的都不行就不看了 
    }
    if(!success) res=-1;
    printf("%d",res);
}

 

 

3.洛谷 P1106 删数问题  传送门

很有趣的有趣题,一开始都容易想假每次删最大的。反例很好找。

在几次尝试后就能发现,每次最优应该删掉该数字的第一个“峰值”。这样找到的数字靠前,影响力大。而对于答案的贡献,因为是一个“峰”,所以其后数字一定比其小,所以删掉后一定最优。

特别注意前导 0。

 

#include<bits/stdc++.h>
using namespace std;
const int N = 255;
char s[N];
int len, k;
int main()
{
    cin >> s >> k;
    len = strlen(s);
    while(k -- )
    {
        for(int i = 0; i < len; i ++ )
        {
            if(s[i] > s[i + 1])
            {
                for(int j = i; j < len; j ++ ) s[j] = s[j + 1];
                break;
            }
        }
        len --;
    }
    int i = 0;
    while(s[i] == '0' && i < len) i ++;
    if(i == len) cout << "0";
    else for(; i < len; i ++ ) cout << s[i]; 
}

 

 


 

其他好玩的题还没写捏。

标签:const,int,线段,len,笔记,include,4.24,贪心
From: https://www.cnblogs.com/Moyyer-suiy/p/17350955.html

相关文章

  • 2023.4.24——软件工程日报
    所花时间(包括上课):6.5h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习并开会。我了解到的知识点:1.了解了一些数据库的知识;2.了解了一些python的知识;3.了解了一些英语知识;5.了解了一些Javaweb的知识;4.了解了一些数学建模的知识;6.了解了一些计算机网络的知识;7.了解了一些考......
  • 4.24打卡
    一、问题描述: 魔术师利用一副牌中的 13 张黑桃,预先将它们排好后迭在一起,并使牌面朝下。然后他对观众说:我不看牌,只要数数就可 猜到每张牌是什么,我大声数数,你们听,不信?你们就看,魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手中的......
  • 单调栈学习笔记
    单调栈基础单调栈根据所维护的单调性可以分为四种:严格递增栈。必须出栈至栈空或栈顶小于当前元素后,才入栈当前元素。严格递减栈。必须出栈至栈空或栈顶大于当前元素后,才入栈当前元素。非严格递增栈。必须出栈至栈空或栈顶小于等于当前元素后,才入栈当前元素。非严格递减栈。......
  • 【学习笔记】快速傅里叶变换
    怎么有人省选后才来学FFT啊由于时间原因,本篇笔记仅为个人总结,真正想要学习FFT的请参看这篇博客。前置知识单位根性质:$w_n^{2k}=w_{n/2}^k$$w_n^a+w_n^b=w_n^{a+b}$算法原理可知n+1个点可以唯一确定一条n次多项式,于是可以用n个点的点对集合表示一条曲线。......
  • BSGS(大步小步算法)学习笔记
    解决高次同余问题。\(a^x\equivb(\modp)\),其中\(a\)与\(p\)同余。这个形式与欧拉定理类似。思想:meetinthemiddle(折半搜索)。具体的,令\(x=A\timest-B\),且\(x\)一定在\([0,\phi(p))\)的范围内。但是\(p\)是质数时复杂度还是会爆炸。将\(x=A\timest-B\)带入......
  • 4.24 1.6
    一、问题描述 二、分析(1)在1附近找任一实数作为x0的初值x0=1.5(2)用初值x0代入方程中计算此时的f(x0)及导。程序中用变量f描述方程的值,用fd描述方程求导之后的值(3)计算增量h=ffd(4)计算下一个x,x=x0-h.(5)用新产生的x替换原来的x0(6)如果|x-xo|>=le-5,,则转到第(3)步,否则转到(7)(7)所求就是方程......
  • Python学习笔记--json序列化时间报错-改源码
    问题:转换时间报错执行代码为:importjsonfromdatetimeimportdate,datetimed={"time1":date.today(),"time2":datetime.today()}res=json.dumps(d)#报错  TypeError:ObjectoftypedateisnotJSONserializable方案1:手动转换str()方案2:继承类......
  • Vue笔记汇总
    Vue3快速上手1.Vue3简介2020年9月18日,Vue.js发布3.0版本,代号:OnePiece(海贼王)耗时2年多、2600+次提交、30+个RFC、600+次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/releases/tag/v3.0.02.Vue3带来了什么1.性能的提升打包大小减少41%初次......
  • 4.24趣味百题2.7
    一问题描述一条长阶梯,若每步跨2阶则剩1阶,若每步跨3步则最后剩2阶,每步跨5阶,剩4阶,每步跨6阶,剩5阶每次跨7阶1阶不剩。请问在1~N内有多少个数满足。二设计思路利用穷举法寻找符合条件的例子选择结构来构造条件。剩几阶可以用取余操作三流程图四c++代码实现#include<io......
  • 2023.4.24
    1//第9讲课件代码2#include<iostream>3usingnamespacestd;4classCPolygon5{6protected:7intwidth,height;8public:9voidset_values(inta,intb)10{11width=a;12height=b;13}14virtualin......