timus 1711.Code Names

来源:互联网 发布:轩辕剑之天之痕mac 编辑:程序博客网 时间:2024/04/20 07:05

鼓励对该题目有过思考后再来看题解,这样会有帮助一点。

刚开始是真的彻底地没思路,后来仔细看看test1的output:

codenamesgrillekeywordsmnemonicplaygamerandomrectanglerejudgeshaitanvolumewatchmen

output呈字典序排列,才清楚题意,有就知道为什么test2的结果会是IMPOSSBLE了

其中input为

11cipher grille kamkohobnames codenames codesnewtests rejudge timussize volume summitwatchmen braineater twosidessolution random yesornokeywords subversion commandsbosses shooting shaitangame strategy playgamemnemonic palindromes bestnameeligibility rectangle rules2 1 7 10 9 6 11 3 8 4 5

实现的代码:

#include<iostream>#include<algorithm>using namespace std;struct A  //数据结构{int num;char s[25];};A a[50];int cmp(A aa,A b)//字典序排列{int i;for(i=0;;){if(aa.s[i]>b.s[i])return 0;else if(aa.s[i]<b.s[i])return 1;i++;}return 1;};int main(){int n,i,j,arr[20];char ans[20][25];  //记录最容易找的方案while(scanf("%d",&n)!=-1){for(i=0;i<3*n;i++){scanf("%s",a[i].s);a[i].num=i/3+1;}sort(a,a+3*n,cmp);for(i=1;i<=n;i++)scanf("%d",&arr[i]);int kk=0,i=1,ff=0;  //ff用来判断是否有满足条件的解法,kk记录上个arr[]访问的位置while(kk<3*n){for(j=kk;j<3*n;j++){if(a[j].num==arr[i]){strcpy(ans[i],a[j].s);i++;break;}}kk=j+1;if(i==n+1){ff=1;break;}}if(ff){for(i=1;i<=n;i++){printf("%s\n",ans[i]);}}else{printf("IMPOSSIBLE\n");}}return 0;}


 

原创粉丝点击