admin 管理员组文章数量: 1184232
Gym
题意:略
题记:
做法一:拓扑排序。五个盘子相当于一个有五个点的有向图,A<B相当于A有一条边指向B。那么建图后做一遍基于BFS的拓扑排序即可。
时间复杂度O(5+5)
#include<bits/stdc++.h>using namespace std;
const int N=10;
int head[N],tot;
int s[N];
vector<int>ans;
struct Edge{int to,next;
}e[N];void init(){memset(head,-1,sizeof(head));memset(s,0,sizeof(s));tot=0;
}void addedge(int u,int v){e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
}bool topsort(){queue<int>q;for(int i=0;i<5;i++)if(!s[i]){q.push(i);ans.push_back(i);}while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];~i;i=e[i].next){int v=e[i].to;if(--s[v]==0){q.push(v);ans.push_back(v);}}}return ans.size()==5;
}int main(){init();for(int i=0;i<5;i++){char u,v,op;cin>>u>>op>>v;if(op=='>') swap(u,v);addedge(u-'A',v-'A');s[v-'A']++;}if(!topsort()) cout<<"impossible"<<endl;else{for(int i=0;i<ans.size();i++)cout<<(char)(ans[i]+'A');cout<<endl;}return 0;
}
做法二:
暴力。next_permutation()算出"ABCDE"的全排列,然后查看排列是否符合题目条件即可。
时间复杂度O(5!)
#include<bits/stdc++.h>using namespace std;
const int N=10;
char a[]={'A','B','C','D','E'};
char s[5][3];bool check(){for(int i=0;i<5;i++){int p1,p2;for(int j=0;j<5;j++){if(a[j]==s[i][0]) p1=j;if(a[j]==s[i][2]) p2=j;}if(p1>p2) return false;}return true;
}int main(){for(int i=0;i<5;i++){cin>>s[i];if(s[i][1]=='>') swap(s[i][0],s[i][2]);}do{if(check()) break;}while(next_permutation(a,a+5));if(check()) for(int i=0;i<5;i++) cout<<a[i];else cout<<"impossible"<<endl;return 0;
}
本文标签: Gym
版权声明:本文标题:Gym 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693693087a237242.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论