【贪心算法】Assign banana to monkeys

Problem description:

There are N Monkeys and N bananas are placed in a straight line. Each monkey want to have a banana, if two monkeys want to own the same banana, there will be a fight! A monkey can stay at his position, move one step right from x to x + 1, or move one step left from x to x -1. Any of these moves consumes 1 second. Assign monkeys to banana so that not monkey fight each other and the time when the last monkey gets a banana is minimized.

Input:

The input contain two arrays of int. The first array is the positions of monkeys. The second array is the positions of bananas.

Output:

The output is a int, which is the time(in seconds) it takes when all bananas are assigned to monkeys.

Sample input:

1 3 6
2 4 6

Sample output:

1

Sample explanation:
Assign monkey at position 1 to banana at position 2. (1 second)
Assign monkey at position 3 to banana at position 4. (1 second)
Assign monkey at position 6 to banana at position 6. (0 second)
Overall time is max(1, 1, 0) = 1 second.

原题地址

UOJ#32

代码如下:注意输入如果很多时,将cin改为scanf能很大程度上降低耗时。

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
/**
 * Assign banana to monkeys 
 */
class Solution {
public:
    int minTime(vector<int>& posMon, vector<int>& posBan){
        N = posMon.size();
        for(int i = 0;i < N;i++){
            if(minimTime < abs(posBan[i] - posMon[i]))
                minimTime = abs(posBan[i] - posMon[i]);
        }
        return minimTime;
    }
private:
    int N, minimTime = 0;
};
int main(){
    int element;
    vector<int> posMon, posBan;  // M个猴子和N个香蕉
    while (cin.peek()!='\n'){
        scanf("%d", &element);
        posMon.push_back(element);
    }
    cin.get();      // 将缓冲区的'\n'取出,防止进入下一个循环
    while (cin.peek()!='\n'){
        scanf("%d", &element);
        posBan.push_back(element);
    }
    sort(posMon.begin(), posMon.end());
    sort(posBan.begin(), posBan.end());
    Solution sol;
    cout<<sol.minTime(posMon, posBan)<<endl;
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值