链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld题目描述
众所周知,广工的宿舍没有电梯,送水的叔叔阿姨每天都需要辛苦的爬楼梯送水。
所幸的是叔叔阿姨们都配备了电动爬楼机,工作显得轻松许多。
但是广工的人太多了,即使是用机器送水还是显得不够快。
所以叔叔阿姨想让你帮忙计算一下送完n+1层楼,所需要的最少时间
已知宿舍的楼层数为n+1,电动爬楼机一次最多可以运k桶水,叔叔用三轮车把所有需要送的水事先送到1楼(所以1楼的水就算已经送完了,不再考虑),而第i+1层需要送ai桶水。机器和每桶水的重量皆为1,机器每次上下楼时,每1点重量就需要花费1个单位的时间,例如机器携带3桶水上一层楼需要花费4个单位时间。而且在机器上装上或卸下1桶水也需要花费1个单位的时间,假定叔叔到达某个楼层卸下水就算送达,请你计算送完所有水并且回到1楼所需要的最少时间。输入描述:
第一行两个整数,第一个整数n代表有n+1楼,(1≤n≤1000000,第二个整数k代表爬楼机最大装载量为k桶(1≤k≤1000000000)。接下来一行有n个整数a,用空格隔开,ai代表第i+1层楼需要送的水的数量,(0≤ai≤100000)。输出描述:
输出一个整数,代表送完所有水所需要的最少时间。示例1
输入
3 3 1 2 3输出
36说明
样例1解释 叔叔可以装3桶水,到2楼放下1桶,到3楼放下两桶,然后返回至1楼,再运三桶水送到4楼卸下返回至1楼 整个过程所花费的时间为: 3(装水) + 4(上2楼) + 1(卸1桶) + 3(上3楼) + 2(卸2桶) + 2(从3楼回到1楼) + 3(装水) + 3*4(从1楼运到4楼) + 3(卸水) + 3(从4楼回到1楼) = 36 也可以先送4楼的水,再送2楼跟3楼。示例2
输入
4 4 1 2 3 4输出
68考虑把时间花费分成三部分计算:
1.水的装与卸的时间贡献。每一桶水的装卸时间花费是2,不会因为送水顺序而改变答案的大小。
2.送每桶水的时间贡献。每一桶水被送到第i+1层楼所需要的花费是i ( 无论这桶水是在何时,通过哪次 运输,贡献都是固定的 )
3.送水车的时间贡献。使用贪心的策略,每次尽可能的优先满足最高楼层的需求。如有剩余,则满足次 高楼层的需求,一直延续下去,直至送完所有水或者达到k桶。 注意:送水车的轨迹是一个来回,故时间贡献需要乘2
AC代码:
#include <bits/stdc++.h> using namespace std; void solve(){ int n,k; cin >> n >> k; long long a[1000010]; long long ans = 0; for(int i = 1;i <= n;i ++){ cin >> a[i]; a[i] += a[i - 1]; } for(int i = 1;i <= n; i++){ ans += (a[n] - a[i - 1]); ans += (a[n] - a[i - 1] + k - 1) / k * 2; } cout << ans + a[n] * 2 << endl; return ; } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); solve(); return 0; } /* */
08-31
3242
09-03
6463
07-17
573
07-21
6530
07-18
1万+
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交