欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

蓝桥学习 PREV-50

发布时间:2024/3/24 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 蓝桥学习 PREV-50 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

试题 历届试题 

PREV-50 对局匹配

** 问题描述 :**

小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。 小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)? 现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。

输入格式 :

第一行包含两个个整数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时,双方会被匹配到,问当在线人数固定时,最多多少人一起匹配都不会匹配到人。这一题有找规律动归那味,但是仔细一想是可以用贪心加上数学知识来做的,主要的点就是不要看错题目!!!,不是分差为k之内而是分差为k。

方法1:

先是数学方法,这一题我们可以先让每一个人都进行匹配,将能匹配到的最多的人算出来,因为两人进入匹配,这时候只要把匹配到的两个人去掉一个,再将加上等待着的人就是所需要的答案了

代码1:

#include<iostream>using namespace std;int main(){int n,m,p;int dp[100010]={0},num=0,max1=0;cin>>n>>m;for(int i=0;i>p;dp[p]++;max1=max(max1,p);}for(int i=0;i+m<=max1;i++){while(m&&dp[i]>0&&dp[i+m]>0){num++;dp[i]--;dp[i+m]--;}while(!m&&dp[i]>=2){num+=dp[i]-1;dp[i]=1;}}cout<<num<<endl;return 0;}

方法2:

再附上动归代码(其中dp[i]为当前所能达到的最大人数,arr[i]为每个积分所有的人数)

#include<iostream>#include<set>using namespace std;int main(){set<int> s;int n,m,num=0,p,max1=0;int book[100010]={0},dp[100010]={0},a[100010]={0};cin>>n>>m;for(int i=0;i>p;book[p]++;s.insert(p);max1=max(max1,p);}if(m==0){cout<<s.size()<<endl;}else{for(int i=0;i<m;i++){int x=0;for(int j=i;j<=max1;j+=m)a[x++]=book[j];for(int j=0;j<x;j++){if(j==0)dp[0]=a[0];else if(j==1)dp[1]=max(dp[0],a[1]);else dp[j]=max(dp[j-1],dp[j-2]+a[j]);}num+=dp[x-1];}cout<<num<<endl;}`return 0;`}

总结

以上是生活随笔为你收集整理的蓝桥学习 PREV-50的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。