第四章 排序 7 AcWing 1561. PAT 评测
原题链接
算法标签
排序
思路
依题意模拟
代码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N = 10005;
const int K=6;
int p_sc[K];
int n, k, m;
//int t, n, m, cnt, ans;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
struct Stu{
string id;
int grade[K];
int sc, tot;
// 无参构造函数 (即便后续不使用, 也要有无参构造函数)
Stu(){
}
// Cpp语法,id(_id)表示将_id的值赋给id。
Stu(string _id):id(_id){
rep(i, 1, k+1){
grade[i]=-2;
}
sc=tot=0;
}
void calc(){
rep(i, 1, k+1){
sc+=max(0ll, grade[i]);
if(grade[i]==p_sc[i]){
tot++;
}
}
}
bool has_sub(){
rep(i, 1, k+1){
if(grade[i]>=0){
return true;
}
}
return false;
}
// 运算符重载后, 对于Stu数据结构的比较操作将使用运算符重载后的(一种)方法, 不同于重写cmp,重写cmp可以根据需求调用不同的cmp方法
bool operator< (const Stu &t) const{
if(sc!=t.sc){
return sc>t.sc;
}
if(tot!=t.tot){
return tot>t.tot;
}
return id<t.id;
}
};
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ump<string, Stu> stu;
cin>>n>>k>>m;
int a;
rep(i, 1, k+1){
cin>>a;
p_sc[i]=a;
}
string tuid;
int tqid, tsc;
while(m--){
cin>>tuid>>tqid>>tsc;
// 首次出现该同学 对该同学数据初始化
if(stu.count(tuid)==0){
stu[tuid]=Stu(tuid);
}
stu[tuid].grade[tqid]=max(stu[tuid].grade[tqid], tsc);
}
vector<Stu> res;
for(auto xx:stu){
auto yy=xx.y;
if(yy.has_sub()){
yy.calc();
res.push_back(yy);
}
}
sort(res.begin(), res.end());
for(int i=0, rank=1; i<res.size(); ++i){
// 对于有序数值在O(n)时间复杂度内得到该数值所处位置
if(i&&res[i].sc!=res[i-1].sc){
rank=i+1;
}
cout<<rank<<" "<<res[i].id<<" "<<res[i].sc<<" ";
rep(j, 1, k+1){
if(res[i].grade[j]==-2){
cout<<"- ";
}else{
cout<<max(0ll, res[i].grade[j])<<" ";
}
}
cout<<"\n";
}
return 0;
}
总结
初次接触对于结构体构造函数,以Stu结构体为例子, 若需要通过id对Stu结构体初始化
// 无参构造函数 (即便后续不使用, 也要有无参构造函数)
Stu(){
}
// Cpp语法,id(_id)表示将_id的值赋给id。
Stu(string _id):id(_id){
rep(i, 1, k+1){
grade[i]=-2;
}
sc=tot=0;
}
参考文献
AcWing 1561. PAT 评测y总代码
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈