洛谷 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 661 图片平滑器(暴力)
661. 图片平滑器 包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元 ...
- CSDN如何获得2020技术圈认证(新徽章哦)
打开CSDN APP 然后登陆上就可以了 把这些看完了就可以了
- Java实现表达式计算求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- Java实现回文判断
1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头 ...
- Java实现第十届蓝桥杯旋转
试题 F: 旋转 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时 针旋转 90 度. 我们用一个 ...
- Java实现第十届蓝桥杯最大降雨量
试题 E: 最大降雨量 本题总分:15 分 [问题描述] 由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨. 这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 ...
- java实现第七届蓝桥杯平方末尾
平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...
- 原生js ajax 封装
首先我们先了解ajax的get和post请求分别是怎样请求数据的 get请求 let ajx = new XMLHttpRequest() //创建ajax实例 /*打开需要请求的地址,可以有三个参数 ...
- Fiddler工具学习使用总结
1.初识fiddler: 作用:截获http/HTTPS请求,查看截获的请求内容,伪造客户端请求和服务器响应,测试网站性能,解密https的web会话,提供插件. 工作环境:支持素有操作系统和所有浏览 ...
- bfs算法总结
BFS(广度优先搜索) 类似于树的按层遍历 常用实现方法:队列 模板: 注意: 只能用来求解无权图的最短路径问题 队列:用来存储每一层便利得到的节点 标记:对于遍历过的结点,应将其标记,以防重复访问 ...