码迷,mamicode.com
首页 > 其他好文 > 详细

对局匹配

时间:2018-02-23 23:47:40      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:dig   mes   insert   continue   val   ret   while   vector   its   

问题描述

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


  小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是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

#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
typedef long long ll;
#define inf 2147483647
#define ri register int
#pragma comment(linker, "/STACK:102400000,102400000")
#define getchar() (Ss==Tt&&(Tt=(Ss=BB)+fread(BB,1,1<<15,stdin),Ss==Tt)?EOF:*Ss++)
char BB[1 << 18], *Ss = BB, *Tt = BB;
inline int read()
{
    int x=0;
    int ch=getchar(),f=1;
    while (!isdigit(ch)&&(ch!=-)&&(ch!=EOF)) ch=getchar();
    if (ch==-)
    {
        f=-1;
        ch=getchar();
    }
    while (isdigit(ch))
    {
        x=(x<<1)+(x<<3)+ch-0;
        ch=getchar();
    }
    return x*f;
}

struct node
{
    int cnt=0;
    int val;
} a[maxn];
int rec[maxn];

vector<int>vec[maxn];
int n,k;
int x;
int ans=0;
int dp[maxn];

//k=0单独处理

int main()
{
    freopen("input10.txt","r",stdin);
//    freopen("outout.txt","w",stdout);
    cin>>n>>k;
    if(!k){
        set<int> num;
        int ans=0,t;
        for(int i=0;i<n;i++){
            cin>>t;
            if(num.find(t)==num.end()){
                num.insert(t);
                ans++;
            }
        }
        cout<<ans; 
        return 0;
    }
    for(int i=1; i<=n; i++)
    {
        x=read();
        vec[x%k].push_back((x-x%k)/k);
    }

    for(int i=0; i<k; i++)
    {
        if(vec[i].empty())continue;
        memset(dp,0,sizeof(dp));
        memset(rec,0,sizeof(rec));
        memset(a,0,sizeof(a));
        sort(vec[i].begin(),vec[i].end());
        int num=0;
        for(int j=0; j<vec[i].size(); j++)
        {
            int x=vec[i][j];
            if(a[rec[x]].cnt)
                a[rec[x]].cnt++;
            else
            {
                a[++num].val=x;
                a[num].cnt=1;
                rec[x]=num;
            }
        }
        for(int j=1; j<=num; j++)
            dp[j]=max(dp[j-1],a[j].val-a[j-1].val!=1?dp[j-1]+a[j].cnt:dp[j-2]+a[j].cnt);
//            cout<<i<<":"<<endl;
//        for(int j=1; j<=num; j++)
//            cout<<dp[j]<<" ";
//        cout<<endl;
        ans+=dp[num];
    }
    cout<<ans;

    return 0;
}

 

对局匹配

标签:dig   mes   insert   continue   val   ret   while   vector   its   

原文地址:https://www.cnblogs.com/planche/p/8463640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!