链接:https://ac.nowcoder.com/acm/contest/327/B
这类题需要多练,写了一个小时竟然只过了6.67%。
我的错误代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<string,int> mp;
struct node{
string name;
int aa[5] = {0};
int ok = 0;
int grade;
}a[501];
bool cmp(node a,node b){
return a.grade < b.grade;
}
int gcd(int a,int b){
if(b == 0)
return a;
else
return gcd(b,a%b);
}
int main(){
int n,m,time,renshu,q,yue;
string name,go;
char id;
cin>>n>>m;
for(int i = 0;i<n;++i){
cin>>name;
mp[name] = i;
a[i].name = name;
}
for(int i = 0;i<m;++i){
cin>>time>>name>>id>>go;
if(go == "AC"){
a[mp[name]].grade += max(500 * (id-'A'+1) - (500 * (id-'A'+1)/250*time) - a[mp[name]].aa[id-'A'],(int)(500 * (id-'A'+1)*0.3));
a[mp[name]].ok = 1;
}
else if(go != "CE"){
a[mp[name]].aa[id-'A'] += 50;
a[mp[name]].grade = 0;
a[mp[name]].ok = 1;
}
else{
a[mp[name]].grade = 0;
a[mp[name]].ok = 1;
}
}
/* for(int i = 0;i<n;++i){
cout<<a[i].grade<<" "<<a[i].name<<" "<<a[i].ok<<endl;
}*/
if(a[mp["cnz"]].ok == 0){
cout<<"-1\n";
return 0;
}
sort(a,a+n,cmp);
renshu = 0;
for(int i = 0;i<n;++i){
if(a[i].ok == 0)
++renshu;
if(a[i].name == "cnz"){
q = i;
break;
}
}
cout<<a[q].grade<<endl;
n -= renshu;
q -= renshu;
cout<<n-q<<"/"<<n<<endl;
return 0;
}
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define N 1001
#define LL long long
using namespace std;
int n,m;
map<string,int> mp;
bool vis[N];
int submitTime[N][N];//submitTime[i][j]第i个人的第j个题的有效提交次数
int submitScore[N][N];//submitScore[i][j]第i个人的第j个题的分数
int grade[5]={500,1000,1500,2000,2500};//5个题的得分
int score[N];//score[i]为第i个的最终得分
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
string str;
cin>>str;
mp[str]=i;
}
for(int i=1;i<=m;i++){
int time;
string submiter,problem,verdict;
cin>>time>>submiter>>problem>>verdict;
int num=(int)(problem[0]-'A');//问题的序号
int order=mp[submiter];//当前提交者的id
vis[order]=true;
if(verdict=="AC"){
submitScore[order][num]=max(grade[num]/10*3,grade[num]-time*(grade[num]/250)-50*submitTime[order][num]);//计算分数
submitTime[order][num]++;//提交次数+1
}
else if(verdict=="WA"||verdict=="TLE"){
submitScore[order][num]=0;//分数为0
submitTime[order][num]++;//提交次数+1
}
else if(verdict=="CE"){
submitScore[order][num]=0;//分数为0
}
}
for(int i=1;i<=n;i++)//统计每个人的最终得分
for(int j=0;j<5;j++)
score[i]+=submitScore[i][j];
int people=0;
for(int i=1;i<=n;i++)//记录参加总人数
if(vis[i])
people++;
int id=mp["cnz"];//记录处女座的序号
if(!vis[id])
printf("-1\n");
else{
int Rank=1;//记录处女座排名
for(int i=1;i<=n;i++)
if(score[i]>score[id])
Rank++;
printf("%d\n",score[id]);
printf("%d/%d\n",Rank,people);
}
return 0;
}