#B3896. 搬砖

题目描述

Aya 在工地上搬砖。她手上有 n 块砖头,需要将其平分为两份运达不同的终点。注意,砖头不能切割成半块。

Aya 可以选择一块一块的搬砖,此时搬一块砖需要 a 的体力。Aya 也可以选择将砖头搬上一个可以容纳 k 块砖头的推车(车可以不装满),再推动推车到达终点,这整个过程需要 b 的体力。Aya 可以自由选择搬砖的方式。例如说她可以一块一块地搬一些砖之后再用推车进行搬砖。

Aya 想要知道,在这个过程中,耗费体力的最小值是多少?

输入格式

输入 44 个正整数 n,a,k,b,含义如题所述。

输出格式

输出一行一个整数,表示耗费体力的最小值是多少。如果无法将这些砖头平分成两份,则输出 −11。

输入输出样例 #1

输入 #1

12 3 2 2

输出 #1

12

输入输出样例 #2

输入 #2

15 3 2 2

输出 #2

-1

说明/提示

【样例解释】

对于样例 11,将砖平分为两份,则每份一共有 66 块砖。用小推车一次可以搬 22 块砖,只耗费 22 的体力,比一块一块搬砖划算。因此 Aya 选择用三次小推车搬砖,耗费 66 的体力。注意一共有两份砖头,因此一共是耗费 12的体力。

【数据范围】

对于所有数据,1n,a,k,b10^6。请注意数据范围。

#include <iostream>
using namespace std;
int main(){
    long long n,a,k,b;
    cin>>n>>a>>k>>b;
    if(n%2==1){
        cout<<-1;
        return 0;
    }
    n/=2;
    if(n%k==0){
        long long l1=2*n*a;
        long long l2=n/k*b*2;
        cout<<min(l1,l2);
    }else{
        long long l1=2*(n/k*b+n%k*a);
        long long l2=(int(n/k)+1)*b*2;
        long long l3=2*n*a;
        cout<<min(l1,min(l2,l3));
    }
    return 0;
}

 

posted @ 2025-07-01 18:51  -刘-j-x-  阅读(15)  评论(0)    收藏  举报