牛客:主持人的烦恼

题目链接:https://ac.nowcoder.com/acm/problem/13591

先点击去做做,再来看张菜菜的拙见。

算法:贪心+简单排序
思路:由于演员的 颜值是乱序的,所以在进行匹配的 时候很可能会有最差和最好两种极端,当然这都不是我们想要的,如何摆脱这样的僵局呢?
假如在有序(进行sort)的数据中进行匹配是不是很nice?

案例数据不易我们分析思路:我列举了一串已经:
在这里插入图片描述
这里设置:n=4,m=3;(这里是相邻元素之间进行作差,冒泡排序思想)
在第一次匹配过长中颜值>=3,因此指针向后走,第二次匹配(数据是:4和16)仍然不匹配,第三次,17-16=1<3 通式:(a[i]-a[i-1]<m)
这就完了?
NO。。。。。。。。。
重点来了:
试问假如匹配成功后还可以再匹配吗?
答案当然是:NO,因为这是两两出演。
我们的操作是一旦匹配成功后就让指针跳两个位置,一个是该i位置,一个是(i-1)位置。

C++代码如下:

#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
	int n,m,i,num;
	while(~scanf("%d%d",&n,&m)){
		num=0;
		for(i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		sort(a,a+n);
		for(int i=1;i<n;i++){
			if(a[i]-a[i-1]<m)
				num++,i++;
		}
		printf("%d\n",num);
	}
}

你问我为什么还要写java代码?
因为菜啊。
java代码如下:

package septmeber;

import java.util.Arrays;
import java.util.Scanner;

public class match {

	public static void main(String[] args) {
		int n,m,num;
		Scanner scan=new Scanner(System.in);
		
		while(scan.hasNext()){	
			num=0;
			n=scan.nextInt();
			int a[]=new int[n];
			m=scan.nextInt();
			for(int i=0;i<n;i++)
				a[i]=scan.nextInt();
			Arrays.sort(a);
			for(int i=1;i<n;i++){
				if(a[i]-a[i-1]<m){
					num++;i++;
				}		
			}
			System.out.println(num);
		}
	}
}

Python代码:

while True:
    try:
        n ,m = map(int,input().split())
        a = list(map(int,input().split()))
        a.sort()
        num=0
        i = 1
        while i<len(a):
            if a[i]-a[i-1]<m:
                num=num+1
                i=i+2
            else:
                i=i+1
        print(num)
    except:
        break
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr顺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值