专栏文章
题解:AT_abc384_c [ABC384C] Perfect Standings
AT_abc384_c题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqrz9i1
- 此快照首次捕获于
- 2025/12/04 09:46 3 个月前
- 此快照最后确认于
- 2025/12/04 09:46 3 个月前
进入正题
这题其实就是求 的所有子序列
各对应一个值,看看 的所有子序列所包含的字母对应值的和,再按这个和降序排序,在和相同的情况下,按照字典序升序排序
剩下的小细节看注释吧
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;
//完结撒花
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...