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