簡單模擬 排名計算問題

2021-10-03 08:19:32 字數 1822 閱讀 2767

題意:

某次考試一共有n道題,每個人做的題都在對應的題號下有個數量標記,負數表示該學生在該題上有過的錯誤提交次數但到現在還沒有ac,正數表示ac所耗的時間,如果正數a跟上了一對括號,裡面有個正數b,則表示該學生ac了這道題,耗去了時間a,同時曾經錯誤提交了b次。例子可見下方的樣例輸入與輸出部分。計算他們的排名。

輸入:

輸入資料報含多行,第一行是共有的題數n(1≤n≤12)以及單位罰時m(10≤m≤20),之後的每行資料描述乙個學生的資訊,首先是學生的使用者名稱(不多於10個字元的字串)其次是所有n道題的得分現狀,其描述採用問題描述中的數量標記的格式,見下面樣例輸入。

輸出:

根據這些學生的得分現狀,輸出乙個實時排名。實時排名顯然先按ac題數的多少排,多的在前,再按時間分的多少排,少的在前,如果湊巧前兩者都相等,則按名字的字典序排,小的在前。每個學生佔一行,輸出名字(10個字元寬),做出的題數(2個字元寬,右對齊)和時間分(4個字元寬,右對齊)。名字、題數和時間分相互之間有乙個空格。資料保證可按要求的輸出格式進行輸出。

輸入樣例:

8 20

gugudong 96 -3 40(3) 0 0 1 -8 0

hrz 107 67 -3 0 0 82 0 0

tt 120(3) 30 10(1) -3 0 47 21(2) -2

omrailgun 0 -99 -8 0 -666 -10086 0 -9999996

yjq -2 37(2) 13 -1 0 113(2) 79(1) -1

zjm 0 0 57(5) 0 0 99(3) -7 0

輸出樣例:

tt 5 348

yjq 4 342

gugudong 3 197

hrz 3 256

zjm 2 316

omrailgun 0 0

解題思路:

一看計算排名就知道是要自定義結構體然後進行排序的問題。好像網上這類題的解法比較傾向於重寫比較函式cmp然後利用sort直接進行排序。我似乎對這種題執迷於使用優先順序佇列,無論簡單的複雜的都喜歡使用,可能是因為去年某次csp認證第四題用優先順序佇列拿了滿分吧。不過重寫cmp函式利用sort對自定義陣列進行排序的方法也需要掌握。使用優先順序佇列也要寫結構體student,注意按照題目排序方式過載』<』(因為優先順序佇列預設是大根堆),然後讀入每個學生的資料,建立student型別物件插入優先順序佇列中,輸出時對佇列一次一次地pop直到隊列為空,每一次輸出top學生的姓名,ac數量和用時即可。在讀入每一道題目資料時先考慮正負性,在資料大於零時再考慮之後是否有左括號,有的話通過括號內正數計算罰時即可。

注意事項:

1、題目指定了輸出資料的格式,name(char陣列)要左對齊10個字元寬使用』%-10s』的控制符,c++使用cout<#include

using

namespace std;

struct student}}

;int

main

(int argc,

const

char

* ar**)

if(scanf

("%c"

,&z)

&&z==

'(')

} s.ac=ac;

s.time=time;

pq.push

(s);

}while

(!pq.

empty()

)return0;

}

簡單計算器模擬

雖然打個簡單計算器不算難事,但是模擬始終算一關,不能忽視基礎。本程式不適用以下情況 表示式中帶空格 表示式中帶括號 僅能進行四則運算,結果限制在int型 include using namespace std intlevel char x intcalculate string s if q1.e...

codeup 模擬加減乘除 問題 A 簡單計算器

題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位...

Problem 模擬簡單計算器

time limit 1 sec memory limit 64 mb submit 4325 solved 1524 程式模擬簡單運算器的工作 輸入乙個算式 沒有空格 遇到 號說明輸入結束,輸出結果。假設計算器只能進行加 減 乘 除運算,運算數和結果都是整數,4種運算子的優先順序相同,按從左到右的...