题目1 : 对局匹配
时间限制: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
总结:这题其实不难,有几个小点需要注意,为了防止越界,自己写for循环里面写的是N-3,,但是没有写等于,这里需要注意,比如N-K,倒数第k个节点,已经是第几个了,所以相当与多减了1,因此需要for循环里面写等于。
这题需要首先排序,这样才好进行处理。
for (int i = 0; i <= N - 3;) { if (check(num,i,K)) { ++cnt; i = i + 3; } else { ++i; } }
#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; system("pause"); }