XTU-OJ 1253-Robot

Robot

题目描述

有N个任务需要Robot去完成,这个N个任务的地点在一个数轴上,坐标为1到n。每个任务需要先完成ai个任务才能开始去做。Robot可以在直线上左右移动,初始位置位于任务1的地点,方向朝向数轴正方向。请问Robot最少转换多少次方向可以完成所有的任务。

输入

存在多个样例。
每个样例的第一行是一个整数n(1≤n≤1000),
第二行是一个n个整数a1,a2,⋯,an(0≤ai<n)。
输入数据保证一定能完成任务。

输出

每行输出一个样例的结果

样例输入

3
0 2 0
7
0 3 1 0 5 2 6

样例输出

1
2

解题思路:这题要简单就非常的简单,如果要优化代码的话,就要用到一些算法。这里我们就无脑一下,直接秒杀掉。

题目要求找 最少的掉头次数,什么时候最少?我们就要用 “贪心” 的思想,在一个方向的查询中,就要把所有的任务都遍历完,把所有能完成的任务都完成掉,这样再掉头,才是最贪心的查询方法,这才是实现 最少的掉头次数 的方法。

AC代码:

#include <stdio.h>

int n,ans,finishNum;
int task[1010];

int main()
{
    while (scanf("%d",&n) != EOF)
    {
        int books[1010] = {0};              // 标记数组
        ans = 0, finishNum = 0;
        for (int i = 1; i <= n; i ++)
            scanf("%d",&task[i]);
        while ( 1 )
        {   // 从左向右,一直到最后一个任务
            for (int i = 1; i <= n; i ++)
            {
                if (task[i] <= finishNum && books[i] == 0)  // 如果能完成该任务
                {
                    finishNum ++;
                    books[i] = 1;
                }
            }
            if (finishNum == n)  break; // 如果任务全完成,break掉
            ans ++;                     // 如果任务还没有全完成,掉头
            // 从右向左,一直到第一个任务            
            for (int i = n; i >= 1; i --)
            {
                if (task[i] <= finishNum && books[i] == 0)
                {
                    finishNum ++;
                    books[i] = 1;
                }                
            }
            if (finishNum == n)  break; // 如果任务全完成,break掉
            ans ++;                     // 掉头
        }
        printf("%d\n",ans);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值