【ACM】洛谷P1068-分數線劃定

題目描述

世博會志願者的選拔工作正在 A 市如火如荼的進行。爲了選拔最合適的人才,AA市對所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根據計劃錄取人數的150%150%劃定,即如果計劃錄取mm名志願者,則面試分數線爲排名第m \times 150%m×150%(向下取整)名的選手的分數,而最終進入面試的選手爲筆試成績不低於面試分數線的所有選手。

現在就請你編寫程序劃定面試分數線,並輸出所有進入面試的選手的報名號和筆試成績。


輸入輸出格式

輸入格式:

第一行,兩個整數 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中間用一個空格隔開,其中nn表示報名參加筆試的選手總數,m表示計劃錄取的志願者人數。輸入數據保證 m \times 150%m×150%向下取整後小於等於 n。

第二行到第 n+1 行,每行包括兩個整數,中間用一個空格隔開,分別是選手的報名號 k(1000 ≤ k ≤ 9999)和該選手的筆試成績 s(1 ≤ s ≤ 100)。數據保證選手的報名號各不相同。

輸出格式:

第一行,有2個整數,用一個空格隔開,第一個整數表示面試分數線;第二個整數爲進入面試的選手的實際人數。

從第二行開始,每行包含2個整數,中間用一個空格隔開,分別表示進入面試的選手的報名號和筆試成績,按照筆試成績從高到低輸出,如果成績相同,則按報名號由小到大的順序輸出。

輸入輸出樣例

輸入樣例#1:
6 3 
1000 90 
3239 88 
2390 95 
7231 84 
1005 95 
1001 88
輸出樣例#1:
88 5 
1005 95 
2390 95 
1000 90 
1001 88 
3239 88 

說明

【樣例說明】

3×150%=4.5,向下取整後爲4。保證4個人進入面試的分數線爲88,但因爲88有重分,所以所有成績大於等於88 的選手都可以進入面試,故最終有5個人進入面試。

NOIP 2009 普及組 第二題


題解

代碼:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    /*
     * 用二維數組a保存數據,然後根據第二維排序
     * 如果第二維相等則第一維從小到大排序
     * 計算人數,然後把後面相同分的加進去
     * 輸出
     */
    int m,n,a[5000+10][2];
    double m_;
    cin>>n>>m_;

    // 向下取整
    m_*=1.5;
    m=m_;

    for (int i = 0; i < n; ++i) {
        scanf("%d%d",&a[i][0],&a[i][1]);
    }

    // 排序
    for (int i = 0; i < n - 1; ++i) {
        for (int j = i+1; j < n; ++j) {
            if (a[j][1]>a[i][1]){
                swap(a[i][0],a[j][0]);
                swap(a[i][1],a[j][1]);
            }
            // 第二維相同則比較第一維
            if (a[j][1]==a[i][1])
                if (a[j][0]<a[i][0])
                {
                    swap(a[i][0],a[j][0]);
                    swap(a[i][1],a[j][1]);
                }
        }
    }

    // 把相同分數加進去
    while (a[m][1]==a[m-1][1])
        m++;

    // 輸出
    cout<<a[m-1][1]<<" "<<m<<endl;
    for (int i = 0; i < m; ++i) {
        printf("%d %d\n",a[i][0],a[i][1]);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章