题目链接: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