欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

对局匹配

程序员文章站 2022-03-12 18:22:18
原创 原题:http://lx.lanqiao.cn/problem.page?gpid=T454 问题描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差 ......

原创


原题:http://lx.lanqiao.cn/problem.page?gpid=t454

问题描述
  小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。

  小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是k的两名用户匹配在一起。如果两人分差小于或大于k,系统都不会将他们匹配。

  现在小明知道这个网站总共有n名用户,以及他们的积分分别是a1, a2, ... an。

  小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于k)?
输入格式
  第一行包含两个个整数n和k。
  第二行包含n个整数a1, a2, ... an。

  对于30%的数据,1 <= n <= 10
  对于100%的数据,1 <= n <= 100000, 0 <= ai <= 100000, 0 <= k <= 100000
输出格式
  一个整数,代表答案。
样例输入
10 0
1 4 2 8 5 7 1 4 2 8
样例输出
6

  动态规划解题,先将数据分组,彼此相差k的数据为一组,这样组与组之间的数据不会受到影响,

只要从每组中选择出最大在线人数,累加起来即可。

  每个数据只能有选择与不选择两种可能,设dp[i-1]存储前i-1个数据(包括第i-1个数据)中能选择的最大人数,则选择

第i个数据后dp[i]=dp[i-2]+value[i],不选择dp[i]=dp[i-1](因为不选择你只能继承),所以得出状态转移方程:

  dp[i]=max[dp[i-2]+value[i],dp[i-1]);

  k=0时特别处理!

java ac

 1 import java.util.*;
 2 
 3 public class main {
 4     
 5     static int n;
 6     static int k;
 7     
 8     public static void main(string[] args) {
 9         scanner reader=new scanner(system.in);    
10         n=reader.nextint();
11         k=reader.nextint();
12         int result=0;
13         int score[]=new int[100005];
14         int dp[]=new int[100005];
15         int max=0;
16         for(int i=0;i<n;i++) {
17             int temp=reader.nextint();
18             if(temp>max) {
19                 max=temp;
20             }
21             score[temp]++;
22         }
23         if(k==0) {
24             for(int i=0;i<=max;i++) {
25                 if(score[i]!=0) {
26                     result++;
27                 }
28             }
29             system.out.println(result);
30             return;
31         }
32         int value[]=new int[100005];
33         for(int i=0;i<k;i++) {
34             int index;
35             index=0;
36             for(int j=i;j<=max;j+=k) {
37                 value[index]=score[j];
38                 index++;
39             }
40             dp[0]=value[0];
41             dp[1]=dp[0]>value[1]?dp[0]:value[1];
42             for(int z=2;z<index;z++) {
43                 dp[z]=math.max(dp[z-2]+value[z], dp[z-1]);
44             }
45             result+=dp[index-1];
46         }
47         system.out.println(result);
48     }
49 
50 }

15:53:41

2018-08-26