Min Difference [AtCoder] [abc212] [C]

题目:C - Min Difference

Time Limit: 2 sec / Memory Limit: 1024 MB
https://atcoder.jp/contests/abc212/tasks/abc212_c

Problem Statement/问题陈述

在这里插入图片描述
简要翻译:给定两个数列A和B,A的长度为N,B的长度为M。现任从A、B中各任取一数字作差的绝对值,求该差的绝对值的最小值。

Constraints/数据范围

在这里插入图片描述
显然这个数据范围如果直接用M*N所有情况都枚举一下肯定是会超时的。

IO/输入输出格式

在这里插入图片描述

样例

输入:
2 2
1 6
4 9
输出:
2
说明:
|1-4|=3  |1-9|=8
|6-4|=2	 |6-9|=3
其中的最小值为2

要取得最小的差,显然作差的两个数要足够相近。不难证明,最小的差在两个数最相近时取得。
那么,如何取得最相近的情况呢?
其实很简单,把A的所有元素和B的所有元素打上标签扔进一个数组里排序,然后从左往右把相邻的标签不同的数字的差的绝对值作为答案记录,并找到其最小值。
以上。

#include <bits/stdc++.h>
using namespace std;
int n, m;
struct node
{
    int num;	//数值
    int co;	//来自哪个数组,1为A,-1为B
} e[3000000];
int ans;
int la,lb;
bool cmp(node a,node b)
{
    return a.num<b.num;
}
int main()
{
    la=-(1<<30);	//上一个来自A的数
    ans=1<<30;		//所求差的绝对值的最小值
    lb=la;			//上一个来自B的数
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &e[i].num);
        e[i].co=1;
    }
    for (int i = 1; i <= m; i++)
    {
        scanf("%d", &e[n+i].num);
        e[n+i].co=-1;
    }
    sort(e+1,e+1+m+n,cmp);			//排序

    for (int i = 1; i <= m+n; i++)
    {
       if(e[i].co==1)
       {
            la=e[i].num;
            ans=min(ans,abs(e[i].num-lb));
       }
       if(e[i].co==-1)
       {
            lb=e[i].num;
            ans=min(ans,abs(e[i].num-la));
       }

    }
    cout << ans << endl;

    return 0;
}
对于“min-min”的概念,我并不清楚您指的是什么。如果您是指最小最小化(Min-Min)调度算法,则以下是一个简单的C语言实现示例: ```c #include <stdio.h> #define TASK_NUM 3 #define MACHINE_NUM 2 int task_time[TASK_NUM][MACHINE_NUM] = {{2, 1}, {1, 2}, {3, 1}}; // 任务时间 int machine_time[MACHINE_NUM] = {0}; // 机器时间 int main() { int i, j, min, min_index, total_time = 0; int task_order[TASK_NUM]; // 初始化任务顺序 for (i = 0; i < TASK_NUM; i++) { task_order[i] = i; } // 对任务按照机器1的时间进行升序排序 for (i = 0; i < TASK_NUM - 1; i++) { for (j = i + 1; j < TASK_NUM; j++) { if (task_time[task_order[i]][0] > task_time[task_order[j]][0]) { int tmp = task_order[i]; task_order[i] = task_order[j]; task_order[j] = tmp; } } } // 对每个任务进行分配 for (i = 0; i < TASK_NUM; i++) { // 选择空闲时间最短的机器 min = machine_time[0] + task_time[task_order[i]][0]; min_index = 0; for (j = 1; j < MACHINE_NUM; j++) { if (machine_time[j] + task_time[task_order[i]][j] < min) { min = machine_time[j] + task_time[task_order[i]][j]; min_index = j; } } // 分配任务到机器 machine_time[min_index] += task_time[task_order[i]][min_index]; if (machine_time[min_index] > total_time) { total_time = machine_time[min_index]; // 更新总完成时间 } } // 打印结果 printf("Task order: "); for (i = 0; i < TASK_NUM; i++) { printf("%d ", task_order[i]); } printf("\nTotal time: %d\n", total_time); return 0; } ``` 该程序实现了Min-Min调度算法的功能,输入为各个任务在不同机器上的时间,输出为最小化完成时间以及任务的执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值