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; // 如果任务还没有全完成ans ++; // 掉头// 从右向左,一直到第一个任务 for (int i = n; i >= 1; i --){if (task[i] <= finishNum && books[i] == 0){finishNum ++;books[i] = 1;} }if (finishNum == n) break; // 如果任务还没有全完成ans ++; // 掉头}printf("%d\n",ans);}return 0;
}