【C++心路历程27】变量排序
来源:互联网 发布:手机淘宝店铺首页设置 编辑:程序博客网 时间:2024/06/13 23:39
变量排序
【问题描述】
把不同的变量进行升序排序用小于操作符命令实现的。例如由A < B, B < C 和 C < D 可以得到升序序列A, B, C, D 。
在本题中,你将得到若干条小于操作符命令,形如 A < B 的格式,请你确定利用这些命令,能否得到一个唯一的升序序列。
【输入格式】
第1行为整数n,m,n(2 <= n <= 26)表示参与排序的是前n个大写字母,m表示给出命令的条数。
【输出格式】
输出一行:
如果根据输入能得到唯一的升序序列,则输出“Sorted sequence determined after xxx relations: yyy…y. ”
如果不能得到唯一的升序序列,则输出“Sorted sequence cannot be determined. ”
如果不能得到升序序列,则输出“Inconsistency found after xxx relations. ”
上面的信息中 xxx 是一个整数,是表示至多根据前xxx条信息就可以得出该结论。 yyy…y表示得到的升序序列的大写字母串。
【输入样例】
【样例1】
4 6
A < B
A < C
B < C
C < D
B < D
A < B
【样例2】
3 2
A < B
B < A
【样例3】
26 1
A < Z
【输出样例】
【样例1】
Sorted sequence determined after 4 relations: ABCD.
【样例2】
Inconsistency found after 2 relations.
【样例3】
Sorted sequence cannot be determined.
【分析】
这道题虽然给了一堆条件,却让我们判断前i个是否可行,于是判断时我们也只需要用前i个条件。在输入时判断即可。
【输入框架】
void init(){ scanf("%d%d%c",&n,&m,&yy);//用前n个字母给出信息 int ok=1; for(int i=1;i<=m;i++) { gets(w[i]); if(check(i)!=2) { ok=0;break; } } if(ok) { printf("Sorted sequence cannot be determined."); }}
而具体到如何检查,即check函数,我们可以由题给条件想到DAG图(排序很特殊)与拓扑序列。其要判断的 唯一性/是否存在性 也与拓扑排序相符。注意判断的几个条件在题中比较关键。
完整代码:
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;const int maxn=10005;int n,m,first[maxn],x,y,np=0,hash[30][30],mark[30],rd[30],t[30];int cnt=1;char w[maxn][30],yy;vector<int>topo;struct edge{ int to,next;}E[maxn<<1];void addedge(int u,int v){ E[++np]=(edge){v,first[u]}; first[u]=np;}int check(int rr){ int cnt=0; for(int i=1;i<=n;i++) { if(mark[i]) cnt++; } //找有效点个数 topo.clear(); int ret=1; queue<int>q; for(int i=1;i<=n;i++) { if(mark[i]&&(t[i]==0)) { q.push(i);topo.push_back(i); } } while(!q.empty()) { if(q.size()>1) { ret=2;//有可能有多条 } int i=q.front();q.pop(); for(int p=first[i];p;p=E[p].next) { int j=E[p].to; if(t[j]) t[j]--; if(t[j]==0) { q.push(j);topo.push_back(j); } } } if(topo.size()<cnt) //出现了环 { printf("Inconsistency found after %d relations.",rr); return ret=0; } if(ret==2) return ret;//如果有多条直接return 即当前条件不足以判断 if(topo.size()==n)//符合条件 { printf("Sorted sequence determined after %d relations: ",rr);//输出 for(int i=n-1;i>=0;i--) { printf("%c",topo[i]+64); } printf("."); return ret=1; } if(topo.size()<n) return ret=2;//补充条件:如果是唯一的 但是却没有达到n个 }void init(){ scanf("%d%d%c",&n,&m,&yy);//用前n个字母给出信息 int ok=1; for(int i=1;i<=m;i++) { gets(w[i]); int v=w[i][0]-64,u=w[i][2]-64; if(!hash[u][v]) { hash[u][v]=1; mark[u]=mark[v]=1; addedge(u,v); rd[v]++; } memcpy(t,rd,sizeof(t)); if(check(i)!=2) { ok=0;break; } } if(ok) { printf("Sorted sequence cannot be determined."); }}int main(){// freopen("in.txt","r",stdin); init(); return 0;}
- 【C++心路历程27】变量排序
- 【C++心路历程5】奇偶排序
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 心路历程
- 《动图系列》选择排序---心路历程
- 【2014年第五届蓝桥杯C/C++程序设计本科B组决赛 Log大侠(编程大题) 】
- 5
- 垃圾邮件是如何用贝叶斯方法过滤掉的
- mysql主从同步配置
- 大数据和机器学习有什么区别【智库2861】
- 【C++心路历程27】变量排序
- TeamTalk源码分析(八) —— 服务器端file_server源码分析
- 关于Plugin with id 'com.github.dcendents.android-maven' not found.问题解决
- 6
- MongoDb(一)介绍安装
- 互信息(Mutual Information)的介绍
- String
- 7
- Learning Spark——Spark连接Mysql、mapPartitions高效连接HBase