`1.对于当前区间[a,b]来说,选择的下一个区间的左端点值a2一定不会大于b,否则就不能完成“覆盖”这一操作。
2.对于当前区间[a,b]来说,如果有多个区间都满足条件1,那么一定选择右端点最大的区间,否则就不能满足“最小”这一目的。`
while(剩余区间数目不为0)
{
if(总长度已经超出覆盖范围)
{
结束循环;
}
for(循环查找符合条件的下一个最大区间);
if(找到了)
{
答案数+1;
总长度 += 最大能切换的区间长度;
}else
{
表示不能完全覆盖,退出循环,答案数 = 0;
}
}
————————————————
3.区间选点问题
这道题目跟区间调度的问题非常类似,我们也可以采用区间调度问题的策略运用到这道题目上面,
尽量往结束时间的端点来选点因为这样做我们可以使尽量少的点覆盖更多的区间,之后就是选点的
问题了,当我们选择了这个点之后需要标记一下,定义一个数轴来记录其中标记过的点,以防下一
次在选点的时候重复选择。
而且在for循环中依次扫描这些给定的区间,看这个区间需要覆盖的点的数量是多少(有可能这个区间
的标记的点出现在另外的区间上那么这个时候我们就选择跳过这个点)
————————————————
乘船问题
private static void solve(int n, int[] speed){
//left为左边的人数3
int left = n;
int ants = 0;
while(left > 0){
if(left == 1){
ants += speed[0];
break;
}
if(left == 2){
ants += speed[1];
break;
}
if(left == 3){
ants += speed[0] + speed[1] + speed[2];
break;
}else{
int s1 = speed[0] + 2 * speed[1] + speed[left - 1];
int s2 = 2 * speed[0] + speed[left - 1] + speed[left - 2];
ants += min(s1, s2);
}
left -= 2;
}
cout<<ants;
}