题解:AT_abc384_c [ABC384C] Perfect Standings

· · 题解

好久都没遇到这么简单的 C 题了

进入正题

atcoder题目传送门

洛谷题目传送门

这题其实就是求 ABCDE 的所有子序列

剩下的小细节看注释吧 ```cpp #include <bits/stdc++.h> #define int long long // 本人的一个习惯 using namespace std; struct node{ int score;//每个人的总成绩 string name;//姓名 }a[32]; map<char,int> m;//用map存abcde的值 signed main(){//define int long long 后记得改signed哦~ //存一下人名,就按样例 1 的顺序来吧 //顺序不影响的 a[1].name="ABCDE"; a[2].name="BCDE"; a[3].name="ACDE"; a[4].name="ABDE"; a[5].name="ABCE"; a[6].name="ABCD"; a[7].name="CDE"; a[8].name="BDE"; a[9].name="ADE"; a[10].name="BCE"; a[11].name="ACE"; a[12].name="BCD"; a[13].name="ABE"; a[14].name="ACD"; a[15].name="ABD"; a[16].name="ABC"; a[17].name="DE"; a[18].name="CE"; a[19].name="BE"; a[20].name="CD"; a[21].name="AE"; a[22].name="BD"; a[23].name="AD"; a[24].name="BC"; a[25].name="AC"; a[26].name="AB"; a[27].name="E"; a[28].name="D"; a[29].name="C"; a[30].name="B"; a[31].name="A"; //可爱的输入 cin >> m['A'] >> m['B'] >> m['C'] >> m['D'] >> m['E']; for(int i=1;i<=31;i++) for(int j=0;j<=a[j].name.size();j++) a[i].score+=m[a[i].name[j]];//计算一下每个人的成绩 //美好的排序 for(int i=1;i<=31;i++){ for(int j=1;j<=31;j++){ //先按成绩好的在前面的排序原则 if(a[i].score>a[j].score)swap(a[i],a[j]); //成绩相同时名字字典序小的在前面 //注意要看一下ij的顺序 //i在前,如果a[i].name大,就把他排在后面 //j在前,如果a[j].name大,就把他排在后面 if(i<j && a[i].score==a[j].score && a[i].name>a[j].name)swap(a[i],a[j]); else if(i>j && a[i].score==a[j].score && a[i].name<a[j].name)swap(a[i],a[j]); } } //输出 for(int i=1;i<=31;i++)cout << a[i].name << "\n"; return 0; //完结撒花 } ```