洛谷 P1347 【排序】
这篇题解没有用拓补排序 (嗐 菜就直说)
个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久)。
吐槽结束,开始正题~
对于这道题为什么可以用\(Floyd\),应该就是传递性了。当\(A>B\)时,\(B>C\),那么现在肯定有\(A>C\)了,想想原来的\(Floyd\),是不是也有点传递性的味道。这样一来,我们就可以在已知一部分条件的情况下,求出其他值的大小关系,最后看是不是每个数都跟其他的每一个数确认了关系,如果是,那么这个数的位置也就出来了,也就是排好序了,不是,就输入下一个数,直到满足每个数都跟其他的每一个数确认了关系。如果还是不能很好理解的话,可以看下代码来理解。
具体代码里面有两个可以优化的地方,但是数据太水,不加也能过。
#include <bits/stdc++.h>
using namespace std;
int n , m , T;
int dis[30][30];
int id(char x){ //字母转化为数字
return x - 'A' + 1;
}
int main(){
cin >> n >> m;
T = m;
for(int i = 1; i <= n; i++) dis[i][i] = 1; //这里统一认为自己大于自己(方便一点)
while(T--){
char a , b , c;
cin >> a >> b >> c;
if(dis[id(a)][id(c)]){ //处理矛盾
printf("Inconsistency found after %d relations." , m - T);
return 0;
}
dis[id(c)][id(a)] = 1; //c大于a
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][k] && dis[k][j]); //变种Floyd i>j和i>k>j都可以表明i>j
/*
for(int i = 1; i <= n; i++) 上面的那个Floyd可以这样优化,因为我们每次只涉及到了a和c,所以只用它们两个更新其他的就可
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][id(a)] && dis[id(a)][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][id(c)] && dis[id(c)][j]);
*/
int f = 1;
for(int i = 1; i <= n; i++){
int x = 0;
for(int j = 1; j <= n; j++)
if(dis[i][j] || dis[j][i]) x++; //如果确定了与其他n个数(包括自己)的关系,那么就可以确定这个数的位置
if(x != n) f = 0;
}
if(f){
printf("Sorted sequence determined after %d relations: " , m - T);
for(int k = 1; k <= n; k++){ //这里应该也能优化,设立一个vis数组,存储当前这个数的位置,如果这个数字的位置早确定了,那么就不算这个数,直接算下一个数 ,具体优化操作不想写了, 原谅我的懒惰T_T
for(int i = 1; i <= n; i++){
int x = 0;
for(int j = 1; j <= n; j++)
if(dis[i][j]) x++; //最小的数只会大于一个数(它自己),第二小的数只会会大于两个数,以此类推
if(x == k) cout << (char)(i + 'A' - 1); //如果符合当前的排名,输出
}
}
cout << "."; //记得这个句号(6泪)
return 0;
}
}
printf("Sorted sequence cannot be determined.");
return 0;
}
双倍经验时间:
洛谷 P1347 【排序】的更多相关文章
- 洛谷——P1347 排序
洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...
- 洛谷 P1347 排序
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B ...
- 洛谷P1347 排序
这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ... 令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]< ...
- 【洛谷P1347】排序
题目大意:给定 N 个变量和 M 个变量之间的偏序关系,问能否求出这 N 个变量之间的一个全序.若能,输出最少利用多少条已知信息即可求的结果,且输出该全序:若无解,输出到第几条已知信息可以判定无解:若 ...
- 题解【洛谷P1347】排序
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...
- 洛谷P2824 排序
解:splay + 线段树合并,分裂. 首先有个乱搞做法是外层拿splay维护,有序区间缩成splay上一个节点.内层再开个数据结构支持合并分裂有序集合. 内层我一开始想的是splay,然后就没有复杂 ...
- 【题解】洛谷P1975排序
分块,注意重复的值之间的处理.跟普通分块的操作一样的啦,具体可以参见‘不勤劳的图书管理员’. #include <bits/stdc++.h> using namespace std; # ...
- 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)
洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
随机推荐
- Java实现 LeetCode 576 出界的路径数(DFS || DP)
576. 出界的路径数 给定一个 m × n 的网格和一个球.球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界.但是,你最多可以移动 N ...
- Javascript实现万年历(日历表)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- java实现第七届蓝桥杯取球博弈
题目9.取球博弈 取球博弈 两个人玩取球的游戏. 一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目. 如果无法继续取球,则游戏结束. 此时,持有奇数个球的一方获胜. 如果两 ...
- surface go重新做系统
此教程适用于使用U盘恢复介质来恢复Surface Go二合一设备系统SurfaceGo_BMR_45_64_1.011.2.zip 大致两个步骤 一.制作U盘恢复介质 下载适用于自己平板的恢复镜像文件 ...
- CRC循环冗余校验---模2除法解析
关于模2除法,网上的人说了一大堆规则和原理,感觉很容易把小白绕进去,下面我只说怎么计算,不说其中的规则和原理.
- PMBOK 基础知识(1)
启动.结束过程 项目管理计划 第一章 引论 第2章项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理 ...
- java第三阶段作业总结
Java第三阶段总结 前言 到这里,Java课程学习进入了尾声,在这学习过程中,我学习到很多,也发现了自己的很多不足,这篇博客主要针对的是Java整门课程学习的总结. 课程收获 对整门课程的学习,我有 ...
- Java 技术网站总结(不停更新)
Spring Spring 中文手册 Spring 教程 Spring For All Spring 学习笔记 Spring Boot Break易站 Spring Cloud 中文文档 Spring ...
- OSI七层模型工作过程&&输入URL浏览器的工作过程(超详细!!)
从以下10个方面深入理解输入URL后整个模型以及浏览器的工作流程! 目录 1.HTTP 2.DNS 3.协议栈 4.TCP 5.IP 6.MAC 7.网卡 8.交换机 9.路由器 10.服务器与客户端 ...
- %matplotlib inline的含义
用在Jupyter notebook中具体作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接在你的python cons ...