排队,小明邀请草原上的动物来吃饭

排队
描述

小明在青青草原开了一家酒楼,草原上的动物都会来这里吃饭,小明担心有的肉食动物会吃掉一些草食动物,于是规定动物们吃饭时间隔必须大于等于len,同时动物们也比较担心店门口经过的动物会伤害他,想要自己的位置离门口的距离至少为x,现在给出每个动物的的需求,你作为一个服务员,请合理分配每个动物的位置

day11-02.zip

输入
第一行两个整数n,len(n<=1000 ,len<=1e6)

第二行有n个数,第i个数表示第i个动物想要离门口的距离为ai(ai<=1e6)

输出
一行,n个数,表示每个动物的位置

输入样例 1

4 10
1 21 11 7
输出样例 1

1 21 11 31

运行结果:

img

代码:

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct _part
{
    long long start;
    long long end;
}Part;


//判断位置pos是否可以坐人
int isFun(long long pos, Part pp[], int cnt)
{
    int i = 0;
    for (; i < cnt; i++)
    {
        if (pos > pp[i].start && pos < pp[i].end) //落在不可用区间
            return 0;
    }
    return 1; //可以坐人
}



int main()
{
    Part pp[1002]; //保存不可用区间
    long long pos[1002]; //保存位置需求
    int n, len;
    int cnt = 0; //区间段的个数
    cin >> n >> len;
    for (int i = 0; i < n; i++)
    {
        cin >> pos[i];
    }

    cout << pos[0]; //安排第一个人坐下x
    pp[0].start = pos[0] - len;
    pp[0].end = pos[0] + len;  //设置(pos[0]-len,pos[0]+len)区间不可坐人
    cnt++;
    
    for (int k = 1; k < n; k++)
    {
        //判断座位pos[k]是否可以坐人
        if (isFun(pos[k], pp, cnt)) //可以坐人
        {
            //坐下,输出位置
            cout << " " << pos[k];
            //添加区间到不可用区间数组
            pp[cnt].start = pos[k] - len;
            pp[cnt].end = pos[k] + len;
            cnt++;
        }
        else
        {
            //找座位
            long long np = pos[k]+1; //尝试的位置
            while (isFun(np, pp, cnt) == 0)
                np++;
            //找到可用座位后,坐下,输出位置
            cout << " " << np;
            //添加区间到不可用区间数组
            pp[cnt].start = np - len;
            pp[cnt].end = np + len;
            cnt++;
        }
        
    }

    return 0;
}

测试样例不足,不是很清楚你的规则
目测应该是对输入的数组排序,然后如果要求的间隔小于10,那么就加大到10,否则照抄

#include <iostream>
using namespace std;

int main()
{
    int n, len;
    cin >> n >> len;
    int a[n], b[n];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        b[i] = i;
    }
       for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                int t = b[j];
                b[j] = b[j + 1];
                b[j + 1] = t;
            }
        }
    int offset = 0;
    for (int i = 1; i < n; i++)
    {
        a[b[i]] += offset;
        if ((a[b[i]] - a[b[i - 1]]) < len)
        {
            a[b[i]] += len - ((a[b[i]] - a[b[i - 1]]));
            offset += len - ((a[b[i]] - a[b[i - 1]]));
        }
    }
    for (int i = 0; i < n; i++)
    {
        cout << a[b[i]] << " ";
    }
       return 0;
}

img

【以下回答由 GPT 生成】

def assign_dining_position(n, len, animals):
    dining_positions = [0] * n
    min_distance = 0
    for i in range(n):
        if animals[i] - min_distance < len:
            dining_positions[i] = min_distance + len
            min_distance += len
        else:
            dining_positions[i] = animals[i]
            min_distance = animals[i] + len
    return dining_positions

n, len = map(int, input().split())
animals = list(map(int, input().split()))
dining_positions = assign_dining_position(n, len, animals)
print(*dining_positions)

注意: 这段代码是使用Python编写的,可以解决给定的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632