专栏文章
题解:B3982 [信息与未来 2024] 数据排序
B3982题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqeyi2z
- 此快照首次捕获于
- 2025/12/04 03:42 3 个月前
- 此快照最后确认于
- 2025/12/04 03:42 3 个月前
主题思路
估算一下模拟的时间复杂度为 代如题目中的数据范围不会超时,所以考虑模拟。现在的问题是题目中的输入让人很苦恼,一大串输入一个空格都没有。其实解决这个问题很简单,因为每个信息都由逗号隔开,所以我们可以一找到逗号就提取信息,如下代码所示。
CPPfor(int i=1;i<n;i++){
cin>>s;
s+=",";
string num="";
for(int j=0;j<=s.size()-1;j++){
if(s[j]==','){
bs[++v]=num;
num="";
}else{
num+=s[j];
}
}
}
同理,我们可以把条件也按此法剥离出来,这样我们就得到了所有数据,现在就可以排序了,用 sort 需要手写 cmp 下面是带注释的 cmp 排序代码。
CPPbool cmp(int i,int j){
for(int k=1;k<=m;k++){//一个一个列举输入的条件
if(x[i][b[k]]!=x[j][b[k]]){//当两数需要排序
if(op[k]=='+'){//按升序排序
if(!f[b[k]]){
if(x[i][b[k]].size()!=x[j][b[k]].size()) return x[i][b[k]].size()<x[j][b[k]].size();//要排序的数长度不相等就可以直接让长度小的数排前面
else return x[i][b[k]]<x[j][b[k]]; //否则字典序小的排前面
}
else return x[i][b[k]]<x[j][b[k]];
}
else{//降序排列(和升序同样的原理)
if(!f[b[k]]){
if(x[i][b[k]].size()!=x[j][b[k]].size()) return x[i][b[k]].size()>x[j][b[k]].size();
else return x[i][b[k]]>x[j][b[k]];
}
else return x[i][b[k]]>x[j][b[k]];
}
}
}
return i<j;//都不满足字典序小的排前面
}
写好 sort 中的 cmp 后,我们再写一行代码就完成了排序。
CPPsort(a+1,a+n,cmp);
最后输出就行了。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...