动规——棋圣匹配
求最多可能有多少名棋手同时在线寻找对手
我们可以相反方向去考虑这道题,就是求最少有多少选手匹配不到对手
而匹配不到对手的 前提是找不到相差k的数,
那就将一个数 i 的 i+k , i-k ,就是前后相差k的数的个数减去,这样子 i 就不存在能够相互匹配的对手了,然后用一个数match记录,match++,
当然要分情况考虑,上面是k不为0时候,
如果k为0时,
把每一种数加一,就是有多少种类的数字就有多少匹配不到对手,把同一个数多的数量全部去掉即可。
最后要输出最多可能有多少棋手同时在线寻找对手,那就是总数减去match即可;
下面代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,arr[100005],match=0,maxn=0;
int main(){cin>>n>>k;for(int i=1;i<=n;i++){int temp;cin>>temp;arr[temp]++;maxn=max(maxn,temp);} for(int i=0;i+k<=maxn;i++){while(k&&arr[i]&&arr[i+k]){match++;arr[i]--;arr[i+k]--;}while(!k&&arr[i]>=2){match+=arr[i]-1;arr[i]=1;}}cout<<n-match;return 0;
}
这里是红糖,记录我的小白成长史。
如果觉得对你有帮助的话可以点个赞,点个关注,创作不易,请多多支持。
我们下篇文章见!!