码迷,mamicode.com
首页 > 其他好文 > 详细

编程练习赛42

时间:2017-12-31 16:40:54      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:cout   循环   div   算法   ace   时间   注意   输入   for   

题目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");
}

 

编程练习赛42

标签:cout   循环   div   算法   ace   时间   注意   输入   for   

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8157909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!