贪心算法:
#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;
}
}
#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;
}
}