首页 > 试题广场 >

代价

[编程题]代价
  • 热度指数:5995 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
你有3个需要完成的任务,完成这3个任务是需要付出代价的。
首先,你可以不花任何代价的完成一个任务;然后,在完成了第i个任务之后,你可以花费|Ai - Aj|的代价完成第j个任务。|x|代表x的绝对值。
计算出完成所有任务的最小代价。

输入描述:
一行3个整数A1,A2,A3,每个数字之间用一个空格分隔。所有数字都是整数,并且在[1,100]范围内。


输出描述:
一个整数,代表最小的代价。
示例1

输入

1 6 3

输出

5
示例2

输入

10 10 10

输出

0
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a[3];
    cin>>a[0]>>a[1]>>a[2];
    sort(a,a+3);
    cout<<a[2]-a[0]<<endl;
    return 0;
}

编辑于 2019-07-11 20:15:19 回复(0)
最小代价即为三个数之间的最小差
即最大减最小
s = list(map(int, input().split()))
print(max(s)-min(s))
运行时间:27ms
占用内存:3440k
发表于 2019-09-02 14:38:45 回复(1)
# 最大值减最小值,多个整数也一样
a = list(map(int, input().strip().split()))
print(max(a) - min(a))

编辑于 2019-07-18 19:08:23 回复(2)
1.输入
2.排序
3.计算相邻差的和
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    int n;
    vector<int> vec;
    for(int i=0;i<3;i++)
    {
        cin>>n;
        vec.push_back(n);
    }
    sort(vec.begin(),vec.end());
    int ans=0;
    for(int i=0;i<vec.size()-1;i++)
    {
        ans+=abs(vec[i+1]-vec[i]);
    }
    cout<<ans;
    return 0;
}

发表于 2019-08-02 14:06:44 回复(0)
完成任务i后,只要选择能使花费|Ai - Aj|最小的任务j即可。其实就是三个任务排序后的前向差分向量元素之和,也是这个数组的极差。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null) {
            String[] strArr = line.split(" ");
            int[] arr = new int[strArr.length];
            for(int i = 0; i < strArr.length; i++) arr[i] = Integer.parseInt(strArr[i]);
            Arrays.sort(arr);
            int cost = 0;
            // 排序后,相邻任务之间的代价差值最小,完成所有任务的总代价最小
            for(int i = 1; i < arr.length; i++) cost += arr[i] - arr[i - 1];
            System.out.println(cost);
        }
    }
}


编辑于 2021-01-30 18:28:38 回复(0)
# 最大值与最小值的差

l = list(map(int, input().split()))
print(max(l)-min(l))
发表于 2020-07-25 02:05:51 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr =new int[3];
        for (int i = 0; i < 3; i++) {
            arr[i]=scanner.nextInt();
        }
        Arrays.sort(arr);
        System.out.println(arr[2]-arr[0]);
    }
}

编辑于 2020-02-28 22:17:33 回复(1)
#include<bits/stdc++.h>
using namespace std;
int main() {
	int x = 0;
	vector<int> f;

	while (cin >> x) {
		f.push_back(x);
	}
	sort(f.begin(), f.end());
	int sum = 0;
	int len = f.size()-1;
	for (int i=len-1; i>=0; --i) {
		sum += (f[i+1] - f[i]);
	}
	cout << sum <<endl;
	return 0;
}

发表于 2019-10-19 14:41:08 回复(0)

第一种:

1.按题目要求求附近两个数的绝对值

2.用两个较小的绝对值相加就得最小代价

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int A1=sc.nextInt();
        int A2=sc.nextInt();
        int A3=sc.nextInt();
        int B1,B2,B3;
        B1=Math.abs(A1-A2);
        B2=Math.abs(A2-A3);
        B3=Math.abs(A1-A3);
        int s;
        if(B1>=B2&&B1>=B3){
            s=B2+B3;
        }else if(B2>=B1&&B2>=B3){
            s=B1+B3;
        }else
        {
            s=B2+B1;
        }
        System.out.println(s);
    }
}

第二种:
1.判断数是否为中间的数

2.用最大的减去最小的得到最小代价

importjava.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        intA1=sc.nextInt();
        intA2=sc.nextInt();
        intA3=sc.nextInt();
    ints;
        if(A1>=A2&&A1=A3&&A1<=A2){
        s=Math.abs(A3-A2);
        }else if(A2>=A1&&A2=A3){
            s=Math.abs(A3-A1);
        }else
        {
            s=Math.abs(A1-A2);}
     System.out.println(s);
    }
}
编辑于 2019-09-19 21:00:10 回复(0)
a_list = list(map(int, input().split()))
avg = sum(a_list) / len(a_list)
minimum_difference = a_list[0]
a_closest_to_avg = a_list[0]
for i in range(len(a_list)):
    difference = abs(a_list[i] - avg)
    if difference < minimum_difference:
        minimum_difference = difference
        a_closest_to_avg = a_list[i]
res = 0
for a in a_list:
    res += abs(a - a_closest_to_avg)
print(res)
老实人做法 
先找到离平均最近的ai
将ai与数组中每一个元素做差并累加到结果res中
发表于 2019-09-10 15:13:50 回复(1)
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    getline(cin,s);
    istringstream ss(s);
    int x, sum=0;
    vector<int> v;
    while(ss>>x){
        v.push_back(x);
    }
    sort(v.begin(), v.end());
    for(int i=1;i<v.size();i++)
        sum += v[i]-v[i-1];
    cout<<sum<<endl;
    
    return 0;
}

发表于 2019-08-17 23:03:27 回复(0)
//本质是最大代价减去最小代价
var arr = readline().split(' ').sort((x, y) => parseInt(x) > parseInt(y));
console.log(arr[2] - arr[0]);
发表于 2019-08-10 13:09:12 回复(0)
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String args[]){
        Scanner sc = newScanner(System.in);
        intA1 = sc.nextInt();
        intA2 = sc.nextInt();
        intA3 = sc.nextInt();
        intB1;
        intB2;
        intB3;
        intres;
        B1 = Math.abs(A1-A2);
        B2 = Math.abs(A1-A3);
        B3 = Math.abs(A2-A3);
        if(B1>=B2&&B1>=B3){
            res=B2+B3;
        }
        elseif(B2>=B3&&B2>=B1){
            res=B1+B3;
        }
        else
        {res=B1+B2;}
            System.out.print(res);
    }
}
新手通过  有错误或改进望指出 
发表于 2019-04-25 16:13:14 回复(1)
import java.util.Scanner;
import java.util.Arrays;
public class Main{
    publicintprintMin(int[] arr){
        Arrays.sort(arr);
        int a=arr[2]-arr[1];
        int b=arr[2]-arr[0];
        int c=arr[1]-arr[0];
        if(a>=b&&a>=c){
            return b+c;
        }else if(b>=c&&b>=a){
            return a+c;
        }else{
            return a+b;
        }
    }
    public static void main(String[] args){
        Scanner sc=newScanner(System.in);
        String s=sc.nextLine();
        String[] ss=s.split(" ");
        int[] arr=newint[3];
        for(int i=0;i<3;i++){
            arr[i]=Integer.parseInt(ss[i]);
        }
        Main test=newMain();
        System.out.println(test.printMin(arr));
    }
}
  • 先从控制台输入符合要求的字符串,然后将的得到的字符串分割转换为整形数组,将整形数组排序。然后求出任意2个数的差值,去除最大差值,剩下2个差值的和及为正确答案。
发表于 2019-04-24 13:03:48 回复(0)
运行时间: 56 ms 占用内存:12080K
1
2
3
4
5
6
7
8
9
10
import java.util.*
public class Main{
public static void main(String[] args){
Scanner in =new Scanner(System.in);
String string1 = in.nextLine();
String number1[] = string1.split(" ");
int number[] =new int[3];
for(inti=0;i<3;i++){number[i]=Integer.parseInt(number1[i]);}
Arrays.sort(number);
System.out.println(number[2]-number[0]);}}
编辑于 2019-05-02 22:36:30 回复(0)
贪心,让数组有序就行

class MainActivity:

    def main(self):
        # Read the data
        nums = list(map(int, filter(lambda x: len(x) > 0, input().split(' '))))
        # Initialization
        nums.sort()
        result = 0
        # Traverse
        for ptr in range(1, len(nums)):
            result += nums[ptr] - nums[ptr - 1]
        print(result)


if __name__ == '__main__':
    M = MainActivity()
    M.main()
发表于 2024-08-26 17:01:04 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    int A[3];
    int i, j, k, cost, min_cost = 1000000;

    // 输入三个数
    for (i = 0; i < 3; i++) {
        scanf("%d", &A[i]);
    }

    // 枚举三个任务的完成情况,并计算总代价
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (i == j) continue; // 任务不能重复完成
            for (k = 0; k < 3; k++) {
                if (i == k || j == k) continue; // 任务不能重复完成
                // 计算总代价
                cost = abs(A[i] - A[j]) + abs(A[j] - A[k]);
                if (cost < min_cost) {
                    min_cost = cost;
                }
            }
        }
    }

    // 输出最小代价
    printf("%d\n", min_cost);

    return 0;
}

发表于 2023-05-09 22:24:07 回复(0)
package main

import (
    "fmt"
    "sort"
)

func main() {
    arr:=make([]int,3)
    for i:=0;i<3;i++{
        fmt.Scan(&arr[i])
    }
    sort.Ints(arr)
    fmt.Print(arr[2]-arr[0])
}

发表于 2023-03-17 22:48:45 回复(0)
将最大和最小值求出来相减就得到结果

#include <iostream>
using namespace std;
 
int main()
{
    int input[3], val = 0, k_max = 0, k_min = 0, max, min;
    cin >> input[0] >> input[1] >> input[2];
    max = min = input[0];
    for (int i = 1; i < 3; i++)
    {
        if (input[i] > max)
        {
            max = input[i];
            k_max = i;
        }
        if (input[i] < min)
        {
            min = input[i];
            k_min = i;
        }
    }
    cout << max - min;
    return 0;
}


发表于 2021-04-09 15:24:34 回复(0)
a1,a2,a3 = [int(x) for x in input().split(' ')]
print(max(max(a1,a2),a3)-min(min(a1,a2),a3))
发表于 2021-04-04 19:14:00 回复(0)