zoukankan      html  css  js  c++  java
  • 字典序问题

    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,

  • 相关阅读:
    poj3016
    BZOJ2560 串珠子
    HAOI 2009 逆序对数列
    BJOI2012 最多的方案
    ZJOI2008 生日聚会
    ZJOI2008 骑士
    SCOI2003 严格N元树
    SDOI2010 地精部落
    USACO Section 3.2 Stringsobits
    JLOI2013 卡牌游戏
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12127085.html
Copyright © 2011-2022 走看看