蓝桥学习 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的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【dSPACE】从0开启dSPACE之路
- 下一篇: 九阳真经: 明摆着就是的事情. 一帮人