查看: 1784|回復: 2
打印 上一主題 下一主題

[ZJ] d401 - B-成績單

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-5-6 15:10:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    原題:http://zerojudge.tw/ShowProblem?problemid=d401
    AC:http://zerojudge.tw/Submissions?problemid=d401&account=lfs92002

    找第K大數,用類似快速排序法可以達到理想Θ(N)的時間找第K大。

    密技:C++ STL - partial_sort 可以只排序到前K項完成,但在此題可能不太適合使用。


    /**********************************************************************************/
    /*  Problem: d401 "B-成績單" from 板橋高中98-2模擬測驗                 */
    /*  Language: CPP (811 Bytes)                                                     */
    /*  Result: AC(0.3s, 4.1MB) judge by this@ZeroJudge                               */
    /*  Author: lfs92002 at 2013-05-19 21:09:42                                       */
    /**********************************************************************************/


    #include<cstdio>
    #include<algorithm>
    using namespace std;

    int search(int *arr,int L,int R,int k)
    {
        int p=L,rl=L+1,rr=R;
            while(rl<=rr)
            {
                    while(rl<=rr && arr[rl]<=arr[p] )++rl;
                    while(rl<=rr && arr[p] < arr[rr])--rr;
                    if(rl<rr)swap(arr[rl],arr[rr]);
            }
            swap(arr[p],arr[rr]);
            if(rr==k)return arr[rr];
            if(rr> k)return search(arr,L,rr-1,k);
            return search(arr,rr+1,R,k);
    }
    int Arr[1000000],Brr[1000000];
    int main()
    {
            int N,An,Bn,u,v,k,ak,bk;
            while(~scanf("%d",&N))
            {
                    An=Bn=0;
                    while(N--)
                    {
                            scanf("%d%d",&u,&v);
                            if(u==1)
                            {
                                    Arr[++An]=-v;
                            }
                            else
                            {
                                    Brr[++Bn]=-v;
                            }
                    }
                    scanf("%d",&k);
                    ak=search(Arr,0,An,k);
                    bk=search(Brr,0,Bn,k);
                    if(ak<bk)
                            printf("1 %d\n",bk-ak);
                    else
                            printf("2 %d\n",ak-bk);
            }
            return 0;
    }




    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    頭香
    發表於 2014-5-6 20:08:01 | 只看該作者
    好像可以用nth_element

    點評

    對阿 就是這個 一時想不起來  發表於 2014-5-6 22:01
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表