网教25. 孤独的运货员
来源:互联网 发布:删除数据库 drop 编辑:程序博客网 时间:2024/05/23 01:26
背景
航空公司的货运飞机往返于各个国家和货物分理中心之间,分理中心的货物运送到各个国家,再将各个国家发出的货物送到分理中心。
分理中心非常庞大,每个国家都有一个自己的货运站,每个货运站有两个平台用于堆放货物。其中 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 平台上货物的总数,之后的每个数字代表每箱货物运送到哪个站。
输出
对于每组输入,你需要在独立的一行中输出完成该任务所需要的时间。
- 2↵
- 5 2 3↵
- 3 4 5 2↵
- 2 1 3↵
- 0↵
- 3 3 5 1↵
- 1 4↵
- 5 2 3↵
- 3 4 5 2↵
- 2 1 3↵
- 0↵
- 3 3 5 1↵
- 1 4↵
- 72↵
- 72↵
#include <stdio.h> #include <string.h> int goods[105][105], truck[105], ans, sum, n, s, q, num[105],num2; //num[i]中存放的是第i个货站中货物的数量,num2存放的是货车中货物的数量 void unLoad(int no) { if (num2 == 0 || num[no] > q) //判断是否可以卸货 return; for (int i = num2; i > 0; i--) //从truck数组取出货物 { ans++; num2--;//货车中货的数量减1 if (no == truck[i]) //当前的货物编号与货站编号相同,放入A平台 sum--; else if (num[no] < q) //当前货物编号与货站编号不同且仓库未满,放入B平台 { num[no]++; goods[no][num[no]] = truck[i];//把货物加入第i个货站的队尾 } else //既不能装入A平台也不能装入B平台 { ans=ans-2; num2=num2+2; ans++; num2--; break; } if (num2 == 0) break; } } void load(int no) { if (num2 >= s || num[no] == 0) //判断是否可以装货 return; int j = num[no], i; for (i = 1; i <= j && num2 < s; i++)//从仓库队列头部取出货物加入到货车尾部 { ans=ans+2; num2=num2+2; num2--; truck[num2] = goods[no][i]; num[no]--; ans--; } if (num[no]!=0) for (int k = i; k <= j; k++) //移动数组元素,把空位消去 goods[no][k - i + 1] = goods[no][k]; } int main() { int t, i = 0, j; scanf("%d", &t); while(t--) { sum = 0, ans = 1, i = 1; scanf("%d%d%d", &n, &s, &q); while (i <= n) { scanf("%d", &num[i]); sum += num[i]; //计算货物的总件数 for (j = 1; j <= num[i]; j++) scanf("%d", &goods[i][j]); i++; } int k = 1; while (1) { unLoad(k); if (!sum) break; load(k); ans += 2; k++; if (k % (n + 1) == 0) k = 1; } printf("%d\n", ans-1); } return 0; }
- 网教25. 孤独的运货员
- BITCS2016程序设计 | 25. 孤独的运货员
- 孤独的运货员
- 数据结构——孤独的运货员
- 孤独的人在孤独的地方...
- 孤独的我在孤独的岗位
- 孤独的夜,孤独的我
- 孤独的狼
- 孤独的思念
- 孤独的人总说无所谓
- 孤独的周五夜
- 生日的孤独
- 孤独歌唱的山
- 一个孤独的流浪汉
- 孤独的寂寞
- 孤独生命的补白
- 孤独的人。。。
- 克服内心的孤独
- 网络状况判断
- MS SQL锁表,查看被锁的表的sql语句
- NOIP2016提高A组模拟9.17总结
- I2C总线的相关程序
- 谷歌chrome多个相同用户登陆同一个机器多开配置
- 网教25. 孤独的运货员
- 对称加密
- Makefile文件的编写
- mysql传统复制环境切换成gtid复制
- 动态规划问题个人总结
- springBoot配置文件application.properties
- 安装numpy,setuptools的时候,不能再注册表中识别出来python2.7
- u-boot-2016.09 make工具之fixdep
- iOS开发 强制竖屏。系统KVO 强制竖屏—>适用于支持各种方向屏幕启动时,竖屏展示广告