题目链接:http://acm.zzuli.edu.cn/problem.php?id=2198
时间限制: 1 Sec 内存限制: 128 MB
题目描述
在ICPC程序设计大赛期间,小P作为志愿者的任务是给各个学校送盒饭,小P一次最多可以携带M份盒饭。总共有N个学校来参加比赛,这N个学校的休息点在一条笔直的马路边一字排开,路的一头是小P取盒饭的地方,假设为原点,每两个相邻点之间,小明需要行走15秒,包括从原点到第一个休息点,交付一份盒饭需要3秒时间。从第一个休息点到第N个休息点需要的盒饭数分别为 a1, a2, a3..., an。 问小P最短需要多少时间把全部盒饭送完并回到原点。
输入
第一行输入一个正整数T,表示有T组测试数据,每组占两行,第一行两个整数M、N(0<M,N<50),第二行输入N个整数a1 a2 a3 ...an (0<=a1....an<50)
输出
每行输出一个整数,对应一组测试数据,表示小P送完全部盒饭并返回原点的总时间(秒)。
样例输入
2
18 2
8 6
10 3
5 0 8
样例输出
102
159
提示
消耗的时间最少只由走的路程最短决定,每一趟来回走的路程是这一次送餐的最远的点距离原点的两倍。
解题思路
我们可以先送后面的,把后面的送过了,再往前送,一直这样模拟就行了。。。
#include <stdio.h>
int main() {
int m, l, c, t, mz, ans, a[55];
scanf("%d", &t);
while (t--) {
scanf("%d%d", &m, &l);
for (int i = 1; i <= l; i++)
scanf("%d", a + i);
mz = m;
while (!a[l] && l)
l--;
ans = 15 * l;
while (l > 0) {
ans += a[l] * 3;
if (a[l] > m) {
a[l] -= m;
m = mz;
c = a[l] / m;
ans += (l * 15 * 2) * (c + 1);
if (a[l] % mz) {
m -= a[l] % mz;
a[l] = 0;
}
else {
a[l] = 0;
ans -= l * 15;
while (!a[l] && l)
l--;
m = mz;
ans += l * 15;
}
}
else {
m -= a[l];
a[l] = 0;
while (!a[l] && l) {
l--;
ans += 15;
}
}
}
printf("%d\n", ans);
}
return 0;
}