黑名单


私信TA

用户名:dotcpp0814371

访问量:6

签 名:

等  级
排  名 78200
经  验 148
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校 广东培正学院
专  业

  自我简介:

TA的其他文章

解题思路:由于每个数只要头和尾,而其中尾只能是0到9,即使当尾为0时不能继续接,也要用10个参数来储存尾巴为0到9的最大长度即可。

p[10]的1到9对应当前尾巴为1到9的长度最长的值,所以每拿到一个新的数,只要检测这个数接上去是否可以使某一个数组最大值增加。

具体表现为先提取头,然后接到尾巴为该数的数组,即对应数组+1,然后与新的数的尾巴原对应的数组进行对比,也就是p[头]+1>p[尾],

大于成立时,将尾巴对应的数组赋值为新的最大值,此时只更新了新的数尾巴对应的数组,所以原先头对应的数组不变。

说白了就是for循环每次都更新尾号0到9的最大长度就是了。

注意事项:
将数组长度要定义到10,是因为尾巴可能为0,并且用1到9对应数组时就不用加一。即使新的数尾巴为0,也要将该值进行上述更新,因为不排除长度最长时尾巴为0的情况。

参考代码:

int main(){
int n,x,a,p[10]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a);
        x=a%10;                       //x为当前该数的尾数
        while(a/10)a/=10;             //将a变成该数的头
            if(p[a]+1>p[x])p[x]=p[a]+1;  //判断该数的头对应的数组加1是否能大于该数的尾巴对应数组的长度。当尾巴为0时,长度储存在p[0]
    }
    for(int i=1;i<10;i++)if(p[i]>p[0])p[0]=p[i];  //最终将尾巴为0到9的最大值传给p[0]
    printf("%d",n-p[0]);  
    return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »