1075 PAT Judge
阿新 • • 發佈:2018-11-22
題目大意:
按照總分>完美解題數>id大小的優先順序排序,所有題全都沒有通過編譯或者全都沒寫的不輸出,對於有輸出者,如果某題沒有提交則輸出“—”,提交但沒有通過編譯或者提交得到0分則該題得分都是0。
解題思路:
就是比較麻煩一點,注意一下不輸出的情況和編譯沒有通過的情況的處理即可,程式碼裡的註釋加的很多。
程式碼如下:
#include<iostream> #include<cstdio> #include<fstream> #include<set> #include<cmath> #include<cstring> #include<string> #include<map> #include<vector> #include<iomanip> #include<cstdlib> #include<list> #include<queue> #include<stack> #include<algorithm> #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) //vector ::iterator it; //set<int>::iterator iter; typedef long long ll; typedef unsigned long long ull; using namespace std; struct pat { int tot,per,pro[6]={-2,-2,-2,-2,-2,-2},id;//總分,完美解題數,每題得分 bool flag=false;//是否需要輸出 }p[10100]; int cmp(pat a,pat b)//排序 { if(a.tot==b.tot) { if(a.per==b.per)return a.id<b.id; else return a.per>b.per; } else return a.tot>b.tot; } void init(int n)//初始化ID { for(int i=1;i<=n;i++)p[i].id=i; } int main() { // std::ios::sync_with_stdio(false); // cin.tie(0); // freopen("test.txt","r",stdin); // freopen("output.txt","w",stdout); int n,k,m,s[6]={0}; cin>>n>>k>>m; init(n); for(int i=1;i<=k;i++)cin>>s[i]; while(m--) { int id,pid,score; cin>>id>>pid>>score; if(p[id].pro[pid]<score&&score>=0)//有效的得分並且需要更新 { if(p[id].pro[pid]<0)p[id].pro[pid]=0;//該題初始值為-2,所以要判斷 p[id].tot=p[id].tot-p[id].pro[pid]+score;//更新總分 p[id].flag=true;//這個ID可以輸出 p[id].pro[pid]=score;//更新此ID對應題目的分數 } if(p[id].pro[pid]==s[pid])//此題獲得了滿分 { p[id].per++;//完美解題數+1 p[id].pro[pid]=inf;//標記掉,防止重複加1 } if(score<0&&p[id].pro[pid]==-2)p[id].pro[pid]=0;//未通過編譯並且這題沒有得分 } sort(p+1,p+n+1,cmp); //輸出第一名 int rank=1; cout<<rank<<' '<<setfill('0')<<setw(5)<<p[1].id<<' '<<p[1].tot; for(int j=1;j<=k;j++) { if(p[1].pro[j]==-2)cout<<" -"; else if(p[1].pro[j]==inf) { p[1].pro[j]=s[j]; cout<<' '<<p[1].pro[j]; } else cout<<' '<<p[1].pro[j]; } cout<<endl; for(int i=2;i<=n;i++)//輸出後幾名 { if(!p[i].flag)continue; if(p[i].tot!=p[i-1].tot)rank=i; cout<<rank<<' '<<setfill('0')<<setw(5)<<p[i].id<<' '<<p[i].tot; for(int j=1;j<=k;j++) { if(p[i].pro[j]==-2)cout<<" -";//此題沒有有效得分的情況 else if(p[i].pro[j]==inf) { p[i].pro[j]=s[j]; cout<<' '<<p[i].pro[j]; } else cout<<' '<<p[i].pro[j]; } cout<<endl; } return 0; }