日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】

發布時間:2024/2/28 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

本次比賽嚴格按照ACM的排名規則進行,但可能很多小伙伴并不太了解這個排名方法,今天小Z來給大家簡單說明一下。每個人的排名根據他解出的題目數量、做題時間還有錯誤提交次數決定,呃。。。在某些特殊情況下跟大家的昵稱也有關系喲~不過不要著急去改昵稱,畢竟是特殊情況,很難遇到的。下面我具體說明一下。

  • 排名的第一關鍵字是解出的題目數,也就是說,解出題目數量多的小伙伴一定會排在解出題目數量少的小伙伴前面

  • 如果解出的題目數量相同,則根據“罰時”決定排名,罰時少者靠前。罰時是這樣定義的:每道成功解出的題目會造成罰時,其他題目不會;每道成功解出的題目造成的罰時是成功解出該題的時間,加上錯誤提交次數20分鐘(比如一道題目在第30分鐘解出,之前錯誤提交了兩次,那么總的罰時就是30+202=70分鐘,這里的錯誤指的是除了Accept之外的所有反饋情況);最終的罰時是所有成功解出題目的罰時的總和。

  • 一道題目正確解出后,再次提交無論結果如何,都不會再對罰時產生任何影響。

  • 如果解出的題目數量和罰時數量都相同,在這個平臺上就會按照昵稱排序。

  • 舉個例子,比如當前有5道題目,你成功解出了1,3,5號題目,1號題目在第5分鐘1次解出,第3號題目在第10分鐘嘗試了一次但是wa了,在第15分鐘解出;第5號題目在第20分鐘解出,之后你又提交了2次;第2號題目你嘗試了4次但是都沒有解出;第4號題目你沒有嘗試。那么最終你的罰時是5 + 0 + 15+1*20 + 0 + 20 = 60分鐘,你解出了3道題。假設此時有另外三個小伙伴A,B,C,成績分別是4題75分鐘,3題90分鐘,2題20分鐘,那么最終的排名是A,你,B,C。

    好了,現在給你一些提交記錄,按照這個規則試著計算一下吧。

    輸入

    第一行包含一個整數T,代表數據組數。
    接下來包含T組測試數據。
    每組數據第一行包含三個整數n,m,q,分別代表參賽人數、題目數量、提交記錄數量。(1<=n,m,q<=10)
    緊接著q行,每行包含4個整數p,t,r,s,意思是p號小伙伴在第t分鐘提交了r號題目,得到了s的反饋,若s==0則代表錯誤,s==1代表正確。注意,你的編號就是1號。其他編號的小伙伴只是陪你一起打比賽玩耍的~(1<=p<=n,1<=t<=100,1<=r<=m,s=0或者s=1)
    輸入保證不存在兩個選手,其通過題目數量和罰時相同。

    輸出

    對于每組測試樣例,輸出一行包含三個整數,分別代表你(1號)的排名、做出的題目數量和罰時

    樣例輸入

    1 2 5 10 1 5 1 1 1 6 2 0 1 7 2 0 1 8 2 0 1 9 2 0 1 10 3 0 1 15 3 1 1 20 5 1 1 30 5 1 1 35 5 0

    樣例輸出

    1 3 60

    提交總是WA,不知道錯在哪了。題目給的測試用例和我自己寫的測試用例都能按照預期運行,是我理解錯題意了嗎,還是細節/邊界問題?還是數組數組大小不夠?

    我寫的測試用例如下:

    測試用例1

    1
    2 5 12
    1 5 1 1
    1 6 2 0
    1 7 2 0
    1 8 2 0
    1 9 2 0
    1 10 3 0
    1 11 3 0
    1 15 3 1
    1 16 3 1
    1 20 5 1
    1 30 5 1
    1 35 5 0
    答案:1 3 80

    測試用例2

    1
    2 5 10
    1 5 1 1
    1 10 3 0
    1 15 3 1
    1 20 5 1
    1 16 3 0
    1 9 2 0
    1 35 5 0
    1 30 5 1
    1 7 2 0
    1 17 4 1
    答案:1 3 77

    測試用例3

    1
    2 5 9
    1 1 1 0
    2 1 2 1
    1 2 2 0
    2 2 2 0
    2 2 3 0
    2 3 3 1
    1 3 1 0
    1 4 2 0
    1 5 1 1
    //1 對1 題 時間20*2+5=45
    //2 對2 題 時間1+20+3=24
    答案:2 1 45

    測試用例4

    1
    3 5 10
    1 1 1 0
    2 1 2 1
    1 2 2 0
    2 2 2 0
    2 2 3 0
    2 3 3 1
    1 3 1 0
    3 4 1 1
    1 4 2 1
    1 5 1 1
    //1 對2 題 時間20*2+20+5+4=69
    //2 對2 題 時間1+20+3=24
    //3 對1題 時間 4
    答案:2 2 69

    測試用例5

    1
    5 2 10
    1 1 1 0
    2 10 4 0
    3 20 5 1
    4 30 2 1
    5 40 1 1
    1 50 2 0
    2 60 4 1
    3 70 5 0
    4 80 3 1
    5 90 2 1
    //1 對0 時0
    //2 對1 時60+20=80
    //3 對1 時20
    //4 對2 時30+80=110
    //5 對2 時40+90=130
    答案:1 0 0

    代碼

    //排名關鍵字: //1 解出的題目數 //2 罰時:解答時間+錯誤次數*20min //3 昵稱 #include<iostream> #include<algorithm> using namespace std;class oneTry { public:int peopleNum;int time;int questionNum;int result;int wrongTime = 0; };class onePeople { public:int waQues[100] = { 0 };//嘗試某題的次數int quesOK[100] = { 0 };//本題是否通過int pNum = 0;//人的序號int accept = 0;//成功題數int pTime = 0;//罰時 };int compareQuesNum(oneTry a1, oneTry a2) {return (a1.questionNum < a2.questionNum); }int compareTryTime(oneTry a1, oneTry a2) {return (a1.time < a2.time); }int compareTime(onePeople a1, onePeople a2) {return (a1.pTime < a2.pTime); }int compareAcc(onePeople a1, onePeople a2) {return (a1.accept > a2.accept); }int main() {//輪數int play;cin >> play;//人數 題目數量 提交記錄數量int totalPeople, totalQuestion, totalTry;cin >> totalPeople >> totalQuestion >> totalTry;//輸入每一次嘗試結果oneTry onetry[15];int i;for (i = 0; i < totalTry; i++){cin >> onetry[i].peopleNum >> onetry[i].time >> onetry[i].questionNum >> onetry[i].result;}//題號排序stable_sort((onetry + 0), (onetry + totalTry), compareQuesNum);//時間排序stable_sort((onetry + 0), (onetry + totalTry), compareTryTime);//計算每個人的罰時int j;onePeople onepeople[100];for (j = 0; j < totalPeople; j++)//遍歷每個人{onepeople[j].pNum = j + 1;for (i = 0; i < totalTry; i++)//查找所有這個人的提交記錄{if (onetry[i].peopleNum == onepeople[j].pNum)//是當前人的提交記錄{if (onepeople[j].quesOK[onetry[i].questionNum] == 1)//已經通過{continue;}else//未通過{if (onetry[i].result == 0)//提交失敗{onepeople[j].waQues[onetry[i].questionNum]++;//嘗試次數++}else//提交成功{onepeople[j].accept++;onepeople[j].quesOK[onetry[i].questionNum] = 1;//標記通過onepeople[j].pTime += onepeople[j].waQues[onetry[i].questionNum] * 20 + onetry[i].time;//計算時間}}}}}//給人排序,先排罰時 注意排序穩定性stable_sort((onepeople + 0), (onepeople + totalPeople), compareTime);//排答對數量stable_sort((onepeople + 0), (onepeople + totalPeople), compareAcc);//計算排名int myrand;for (i = 0; i < totalPeople; i++){if (onepeople[i].pNum == 1){myrand = i;}}//輸出cout << myrand + 1 << ' ' << onepeople[myrand].accept << ' ' << onepeople[myrand].pTime;system("pause"); }

    總結

    以上是生活随笔為你收集整理的ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。