专栏文章

题解: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 个月前
查看原文
好久都没遇到这么简单的 CC 题了
进入正题
这题其实就是求 ABCDEABCDE 的所有子序列
abcdeabcde 各对应一个值,看看 ABCDEABCDE 的所有子序列所包含的字母对应值的和,再按这个和降序排序,在和相同的情况下,按照字典序升序排序
剩下的小细节看注释吧
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 条评论,欢迎与作者交流。

正在加载评论...