字典序问题
1,还有点小问题。
2,传数组的话只要传数组名就可以了。我都想重修C语言了。。
3,有点烦啊没有输出,好像也没有结束那个符号。自己的问题!
4,
#include<iostream> #include<bits/stdc++.h> using namespace std; const int maxn=1005; int n; char C[maxn]; char T[maxn]; void solve(char c[]) { int a=0; int b=n-1; while(a<=b) { bool left=false; for(int i=0;a+i<=b;i++){ if(c[a+i]<c[b-i]){ left=true; break; } else if(c[a+i]>c[b-i]){ left=false; break; } } if(left) putchar(c[a++]);//这个是先输出再自加 else putchar(c[b--]); } } int main(){ cin>>n; for(int i=0;i<n;i++) cin>>C[i]; solve(C); }
5,但是我觉里面那些细节条件我绝对没搞清。
还有人家算法思想是那样,但是人家的实现真的很简单的。
6,代码细节看起来还是挺难理解的。不过不是说好的先背先抄代码么
7,你能出现这种错误说明你对代码的理解太差了。。。这个错误我最终总结为。。。嗯。。题意的问题啊。是要加到尾部!!!
而且是字典序尽可能小的好不!
8,我来们费大
其实我觉得可以用选数的IF-ELSE来解释。但是这样的话,会产生更多的时间复杂度和空间。虽然它这个思想确实是这个样子。我去我第二步都没有做完全。。OJ上是compiler error 和 presentation error。。。我真是的。
9,碰上问题不要急,一个方法试了几下就要去找其他方法。
比如这个坑爹。。原题还有条件呢。。行了费大。就选数的那个IF-ELSE那种结构思想。
10,至于代码细节,我很推荐你去用样例然后在纸上模拟一遍这样我会有一个好的理解~!
11,费大还是不好。为什么呢?你想每次从原字符串首尾取字典序最小的,是否考虑了相等的情况,相等的情况下又该怎么设计程序。原题意不就是这样吗?据我所感觉,一般的题都有坑,像这个往前进一步,将字符串反转来比较,确实解决了。不过我突然又觉得相等无所谓?
还是有点思维难度的吧?但是,相等是有所谓的,因为我们基于的是求字典序最小的字符串,因此我们要尽早地使用更小的字符。我之前还确实没有认识到这点。k
一串本身就带有一个可比较属性的东西。可以想象成数字?抽象出来这个题这个东西的本质上的东西,其实就是比较它们所代表的数字。
所以这个就叫数字比较问题。这个费大还可以。
12,至于费小,用样例模拟了一下,倒是几个点都比较明确了。
不过你改不了代码的话,那就还是不行。。。
while(a<=b)//因为你要比较两边嘛,a<=b还是可以的 { for(int i=0;a+i<=b;i++)//a+i是因为你比较最后一个的话,总是在循环。 { if(c[a+i]<c[b-i]) { left=true; cnt++; break; } else if(c[a+i]>c[b-i]) { left=false; cnt++; break; }//中间这一大部分就是正常情况以及有首尾相等的话看下一个 }
不清楚的话最好用样例在纸上模拟一遍就清楚了。当然这是不够的!
嗯我改了,果然for中的a+i<=b是承接上面的a=b的。然后我改成a+i<=b也过了 哈哈。
我觉得这个算数哈哈
13,
#include<iostream> using namespace std; const int maxn=100005; int n; char S[maxn]; int cnt=0; void solve(char c[]) { int a=0; int b=n-1; bool left=false; while(a<=b)//因为你要比较两边嘛,a<=b还是可以的 { for(int i=0;a<=b-1;i++)//a+i是因为你比较最后一个的话,总是在循环。 { if(c[a+i]<c[b-i]) { left=true; cnt++; break; } else if(c[a+i]>c[b-i]) { left=false; cnt++; break; }//中间这一大部分就是正常情况以及有首尾相等的话看下一个 } if(left) cout<<c[a++]; else cout<<c[b--]; if(cnt % 80 == 0) cout<<endl; } } int main(){ cin>>n; for(int i=0;i<n;i++) cin>>S[i]; solve(S); }
14,