2021年广东工业大学第11届腾讯杯新生程序设计竞赛题目J及题解

链接:登录—专业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;
}
/*

*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值