时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi开发了一个在线玩斗地主的游戏平台。现在平台上有N名用户正在寻找对局,其中第i名用户的积分是Ai。
小Hi希望自己的平台可以自动将这N名用户匹配成尽量多的3人牌局。同时他希望一局中的3名用户两两之间的积分差不超过K。
你能帮小Hi实现这个自动对局匹配的算法吗?
假设现在正有7人在寻找对局,积分分别是[30, 31, 30, 34, 33, 32, 34]并且K = 1,这时最多可以匹配出2局:[30, 31, 30]和[34, 33, 34]。
输入
第一行包含两个整数,N和K。 (1 ≤ N ≤ 100000, 1 ≤ K ≤ 100000)
第二行包含N整数Ai。(0 ≤ Ai ≤ 100000)
输出
一个整数表示最多能匹配出的对局数量。
样例输入
7 2
30 31 30 34 33 32 34
样例输出
2
思路:年轻的时候不太懂dp,,,总以为和蓝桥杯拿到(见上文)是一钟类型的题。后来想了想,,,,呃,,,,对,不用dp,更不用统计各个数字出现次数,直接排序,一组一组判断就好了。
上代码。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool check(vector<int> &num,int begin,int K) {
int i = begin;
if (num[i + 2] - num[i + 1] > K) {
return false;
}
else if (num[i + 1] - num[i ] > K) {
return false;
}
else if(num[i + 2] - num[i] > K) {
return false;
}
return true;
}
int main() {
int N, K;
cin >> N >> K;
vector<int> num;
for (int i = 0; i < N; ++i) {
int tmp;
cin >> tmp;
num.push_back(tmp);
}
sort(num.begin(), num.end());
int cnt = 0;
for (int i = 0; i <= N - 3;) {
if (check(num,i,K)) {
++cnt;
i = i + 3;
}
else {
++i;
}
}
cout << cnt << endl;
}