1. 程式人生 > 其它 >P4447 分組題解

P4447 分組題解

題目傳遞門

#include <bits/stdc++.h>

using namespace std;
const int N = 100010;
int a[N];            //儲存人員能力值
bool b[N];           //桶,用來記錄是否使用過
int MIN = 0x3f3f3f3f;//組中最少人數值
int n;

int main() {
    cin >> n;
    //輸入實力值並排序
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);//貪心演算法,都是排序,從小到大

    //遍歷每個學生
    for (int i = 1; i <= n; i++) {
        if (!b[i]) {           //此學生沒有加入到組中
            b[i] = true;       //準備把他加入到某個組中

            int c = a[i];
            //對於當前學生的後面每個學生
            for (int j = i + 1; j <= n + 1; j++) {      //只有n+1這麼寫,最後一個才能加進來,執行這個迴圈
                if (!b[j]) {   //如果此人沒有加入到組中
                    if (a[j] - c != 1 && a[j] != c) {   //與前一個差不是1,而且與前端的也不一樣,這時,表示前面的分組就已經結束了,需要畫句號了
                        MIN = min(MIN, j - i); //完成本次分組,看看長度是多少
                        break;                 //本次結束
                    } else if (a[j] - c == 1) {
                        c = a[j];               //持續本次分組中
                        b[j] = true;            //標識
                    }
                }
            }
        }
    }
    //輸出大吉
    cout << MIN << endl;
    return 0;
}