【题意】
给出一个PAT提交列表,输出排名结果
【思路】
此题细节稍多,难度不大,直接码即可
【注意点】
一开始我在处理最后要输出的用户列表时想省空间,于是在原vector里删除,结果有个点总是超时,改成scanf和printf还是不行。后来猜测可能是频繁对vector进行删除、每次都要挪动后面的元素导致的超时,于是另开了一个vector存放结果,果然AC了
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXIMUM 0x0fffffff
struct user{
int uid;
vector<int> scores;
vector<bool> submited;
int acCnt;//AC数
int totalScore;
bool flag;//提交过能通过编译的代码则为true
user():acCnt(0),totalScore(0),flag(0){};
};
bool cmp(user u1, user u2){
if(u1.totalScore>u2.totalScore){
return 1;
}
else if(u1.totalScore==u2.totalScore && u1.acCnt>u2.acCnt){
return 1;
}
else if(u1.totalScore==u2.totalScore && u1.acCnt==u2.acCnt && u1.uid<u2.uid){
return 1;
}
return 0;
}
int main(int argc, char const *argv[])
{
int n,k,m;
vector<int> fullScores;
vector<user> users;
scanf("%d%d%d", &n, &k, &m);
users.resize(n);
fullScores.resize(k);
for(int i=0; i<n; i++){
users[i].uid = i+1;
users[i].scores.assign(k,0);
users[i].submited.assign(k,0);
}
for(int i=0; i<k; i++){
scanf("%d", &fullScores[i]);
}
for(int i=0; i<m; i++){
int uid,pid,partialScore;
scanf("%d%d%d", &uid, &pid, &partialScore);
uid--;
pid--;
users[uid].submited[pid] = true;
if(partialScore>=0){
users[uid].flag = true;
if(partialScore>users[uid].scores[pid]){
users[uid].totalScore += partialScore-users[uid].scores[pid];
users[uid].scores[pid] = partialScore;
if(partialScore==fullScores[pid]){
users[uid].acCnt++;
}
}
}
}
vector<user> validUsers;
for(int i=0; i<users.size(); i++){
if(users[i].flag){
validUsers.push_back(users[i]);
}
}
sort(validUsers.begin(),validUsers.end(),cmp);
int tmpScore = MAXIMUM,tmpRank = 0;
for(int i=0; i<validUsers.size(); i++){
if(validUsers[i].totalScore<tmpScore){
tmpScore = validUsers[i].totalScore;
tmpRank = i+1;
}
printf("%d %05d %d", tmpRank, validUsers[i].uid, validUsers[i].totalScore);
for(int j=0; j<k; j++){
if(!validUsers[i].submited[j]){
printf(" -");
}
else{
printf(" %d", validUsers[i].scores[j]);
}
}
printf("\n");
}
system("pause");
return 0;
}