背景
航空公司的货运飞机往返于各个国家和货物分理中心之间,分理中心的货物运送到各个国家,再将各个国家发出的货物送到分理中心。
分理中心非常庞大,每个国家都有一个自己的货运站,每个货运站有两个平台用于堆放货物。其中 A 平台用于堆放运送到该国的货物,而 B 平台堆放着其它国家的货物。各个国家的货运站排成一个环形。
平时,有货运汽车沿着环形的线路在各个国家的货运站之间运行。货运汽车的仓库是非常狭窄的,先放进去的货物只能等后放进去的货物移走之后才能搬出来。
当货运汽车到达一个站点 X 时,它首先卸货。卸货的过程是:首先查看最外面的箱子是否标记着 X 标签,如果是,代表这是运送到 X 国的货物,则放到 A 平台上,如果不是,则把该货箱放到B平台货物队列的末尾,然后处理下一箱货。当 B 平台放满或者是车被搬空,则开始装货。装货的过程是:从 B 平台货物队列的开始处装车,把车装满或把 B 平台搬空则装货结束。车子开往下一个货运站。
卸下一箱货物和装载一箱货物均需要一分钟的时间,且假设当货车从一个货运站开往另一个货运站的时间为两分钟。
每天,货车和货运飞机都这样周而复始的运行着,直到有一天因为报酬的原因,分理中心的工人开始罢工。货运飞机依然运行,但却无法运走任何货物。
任务
你是老板的心腹,平时深受老板关照。因此,你决定停止罢工,独自担当起分理的任务。现在,分理中心已经堆积了大量的货物,你决定在开始前先写程序计算一下要完成搬运需要多长的时间。
输入
对于输入部分包含几组数据,第一行是一个整数SET,表明下面有几组数据,随后便是这几组输入数据。
对于每一组输入数据,其第一行为三个整数 N、S 和 Q。其中 N(2<=N<=100) 表示环中站的个数。S(1<=S<=100) 表示货车的最大容量,即货车同时可以装载多少箱货物。而 Q(1<=Q<=100) 表示 B 平台所能放置的货物的总数,假定该系统中所有货运站 B 平台的最大容量都相同。
从第二行往后一共有 N 行,每行一的第一个数字代表该站 B 平台上货物的总数,之后的每个数字代表每箱货物运送到哪个站。
输出
对于每组输入,你需要在独立的一行中输出完成该任务所需要的时间。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
思路如下:
move函数,接收一个数组和一个数字作为参数,将数组中的元素向前移动一位,最后返回新的元素数量,主要为了调整次序。装载过程中调用,用于移动货物。
load函数,装载。当装载数量没有达到上限并且还有货物需要装载时,将货物一个一个从b移动到track,计时。(注意调用move调整b中次序)卸载过程中调用,用于装载货物
unload函数:卸载。当有货物需要卸载时,检查是否有匹配的货物。如果有,卸载,计时;如果没有,检查b是否装满,如果是,取消卸货,调用load
函数装载;如果不是,就将货物从track移动到b,计时。
在合适的时候调用即可,这道题也可以用链表做,好像说用栈也行,但是懒得写了。
代码如下:
#include <stdio.h>
int N, Q, S, time, numt;
int move(int b[100], int num)
{
for (int k = 1; k < num; k++)
b[k - 1] = b[k];
return --num;
}
int load(int b[100], int track[100], int num)
{
while (numt != S && num != 0)
{
track[numt++] = b[0];
num = move(b, num);
time++;
}
return num;
}
int unload(int b[100], int track[100], int num, int j)
{
while (1)
{
if (numt != 0)
{
if (track[numt - 1] == j + 1)
{
numt--;
time++;
}
else
{
if (num == Q)
return load(b, track, num);
else
{
b[num++] = track[--numt];
time++;
}
}
}
else
return load(b, track, num);
}
}
int main()
{
int i, j, k, SET, B[100][100], track[100], num[100], sum;
scanf("%d", &SET);
for (i = 0; i < SET; i++)
{
scanf("%d%d%d", &N, &S, &Q);
for (j = 0; j < N; j++)
{
scanf("%d", &num[j]);
for (k = 0; k < num[j]; k++)
scanf("%d", &B[j][k]);
}
time = 0;
for (j = 0; j < N; j++)
{
num[j] = unload(B[j], track, num[j], j);
sum = 0;
for (k = 0; k < N; k++)
sum += num[k];
sum += numt;
if (sum == 0)
{
printf("%d\n", time);
break;
}
else
{
if (j == N - 1)
j = -1;
time += 2;
continue;
}
}
}
}