贪心算法

贪心算法
#171 智力大冲浪
  按价格排序;
  我们要占据哪个时间段;
  bool数组;
  1 2 3 4 5 6 7
  ····  
  ———————
  n=n-30-20
  
  总:
  读入数据;
  价格从大到小排序;
  从头开始,看哪个没占,就占掉。


什么叫贪心:
  贪心是个策略;
  贪心一般都要排序;



#174 修理牛棚

  M-1次截取
 算出所有牛与牛之间的间隙;
 如:
   3 4 间为零;
   4 6 间为一···
   找三个间隙;
   所有牛棚都要盖住。


#52 主程序:



for (int i=1;i<=n;i++)
{
  x3=x1+x2;
  x1=x2;
  x2=x3;
}
cout<<x2;


1:1
2:2 x1   =3
3:3 x2   =5
4:5 x3
5:8   x1=x2;x2=x3; x3=x2+x1
6:    x2+x1




#176 ???
    __________
_____                       @
  ________
      __________


按右端点从小到大排序,最后来选择;


伪代码:

strict L
{
 int left,right;
}line[51000];
bool m(L x,L y)
{
 return x.right>y.right
for (int i=1;i<=n;i++)
  scanf("%d %d",&line[i].left,&linr[i].right);


sort(line+1,line+n+1,m)
int ans=0;
int now=1;//第一行要保留;
for(int i=2;i<=n;i++)枚举
{
   if (line[i].Left>=line[now].right)
   {
      ans++;
      now=i;//第i条线段要,就要看后面;
   }
}



在输出ans即可;
代码可以控制在30行以内;




#177 穿墙人

  他能穿k组墙;
  使他穿过一行;  
  有一个节点不能交叉成k;
思路:
  大于删右端点最大的;超过k次删



strict L
{
 int left,right;
}line[51000];
bool m(L x,L y)
{
 return x.right>y.right
for (int i=1;i<=n;i++)
  scanf("%d %d",&line[i].left,&linr[i].right);


sort(line+1,line+n+1,m)
int ans=0;
int now=1;
for(int i=2;i<=n;i++)
{
   1)看这条线段能不能被放
   2)如果可以放,单位+1
   if (line[i].Left>=line[now].right)
   {
      ans++;
      now=i;
   }
}


 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值