2021-03-27

每周学习总结

今周主要讲了贪心算法,以及动态规划的内容。还是通过做题来积累经验,尤其是周五经历了大型的acm比赛,感受了他们的出题形式,以及佩服于真正acm大神平均3,4秒一道题的神速。感觉就是真正的acm比赛题设计的题型是很广的,而平时做的题型基本都是以专题的形式而出的,就比如最近做的有关贪心算法的题专项性很强。所以以后可以自己从codeforces找一些自己不擅长的题型做做。
下面步入正轨,讲讲我本周的收获。

集合元素最少覆盖区间

这个问题其实是上个星期讲的,主要意思是找一个元素个数最少的集合,使得每个区间里至少有m个整数,我把它称作“集合元素最少覆盖区间问题”。
但是上星期讲的例子是m=1的时候较为简单,知道今周在vj上做题遇到m=2的情况,认为是个题型,该总结一下。
四条线表示四个区间
|————|(一)
0 2
|————|(二)
2 4
|———————|(三)
3 7
|————|(四)
4 6
按区间最大值从小到大排序
m=1时:
令区间一的最大值b1与区间二的最小值a2比较,如果a2<=b1就进行下一个循环,与下一个区间三比较;如果a2>b1,就f++标记区间二的最大值b2,令b2与下面a3比较(接下来情况和区间一一样)……
main()
{
cin>>n;
for(int i=1;i<=n;++i)cin>>aa[i].a>>aa[i].b;
sort(aa+1,aa+n+1);
for(int i=1,x=-1;i<=n;++i)
{
if (x>=aa[i].a) continue;//如果当前区间包含标记点,就跳过。
++sum; x=aa[i].b; //更新标记点。
}
cout<<sum<<endl;
return 0;
}
m=2时:
1.开始我的思想是,将区间先按最大值从小到大排序算一遍,和m=1的情况一样,把符合的数放到一个数组里,再按最小值从小到大排序,算出来,放到数组里,在对数组去重,看看元素个数。也ac了,但这种做法只适用于m=2的时候,m再大时就不能做了。
m>2时
2.还有一种正解是,开始从区间一从最大值标记m个数,存入数组,用区间二最小值与这m个数相比,主要找区间二中包含几个这个数组元素,把个数记为t。
如果t>=m个,就跳过进行下一个区间的比较;
如果t<m个,就从该区间取m-t个数,存入数组。
再从下一个区间中找包含几个这个数组个数,下面的操作和区间一和二一样了。
希望下个星期好好努力,把基础夯实。
加油^0^~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值