zoukankan      html  css  js  c++  java
  • 对局匹配

    原创


    原题: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

  • 相关阅读:
    Redis QPS测试
    go语言下载及安装
    企业级Docker镜像仓库Harbor部署与使用
    Linux格式化数据盘
    【一周一Q】如何快速复制有规律内容
    聊一聊职业能力之执行力
    面试那些事
    使用gitlab时候 fork仓库不会实时从主仓库更新解决方案
    从给定字符串中提取姓名
    测试Websocket建立通信,使用protobuf格式交换数据
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9537628.html
Copyright © 2011-2022 走看看