題意:
某次考試一共有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種運算子的優先順序相同,按從左到右的...