| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1431 人关注过本帖, 1 人收藏
标题:思路有了 就是不懂编
只看楼主 加入收藏
楓楪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-8-5
结帖率:75%
收藏(1)
已结贴  问题点数:100 回复次数:21 
思路有了 就是不懂编
删数问题
键盘输入一个高精度的正整数N,去掉其中任意S个数字后使剩下的数最小。(N不超过240位)
例如:
N=175438, S=4
可以删去7,5,4,8,得到13。


删S次,每次删的数要使剩下的数尽量小。例如上面的例子,第一次删7,至少比第一次删1,5,4,3,8
删数过程是:

175438
15438
1438
138
13

【输入】
n  

s
【输出】
最后剩下的最小数。
【样例输入】
175438
4
【样例输出】
13
就是从左向右找到第一个i,使n[i]>n[i+1],如果找到了,就删除第i个,否则删除最后一位。
注意:当高位变为0时,0则丢去。
搜索更多相关主题的帖子: 思路 
2009-08-06 23:55
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
你的思路很麻烦,还有更简单的办法。。
2009-08-07 00:04
楓楪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-8-5
收藏
得分:0 
我在学那个贪心算法 所以就要用这个算法来做
2009-08-07 00:07
楓楪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-8-5
收藏
得分:0 
我要睡觉了 我要在梦中想办法了
2009-08-07 00:11
陨落
Rank: 2
等 级:论坛游民
帖 子:36
专家分:16
注 册:2009-6-27
收藏
得分:0 
好高深啊。
2009-08-07 00:34
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:40 
不好意思,没发现楼主已经给出了算法!

算法大致思路是:
从高位到低位,找到降序的把前面的那个删掉 ,如果降序的都删完了,剩下的找出最大的数字删掉,就是最后几个。
例如:
N=175438, S=3
查17为升序;
75为降序,将7删掉;
54为降序,将5删掉;
43为降序,将4删掉。


N=175438, S=4
前三个不变;
剩下138,只需删掉最后一个(8)即可。

但是,这个算法按从高到低顺序做是有错的

例如
N=675438, S=3
我们会跳过67,然后删掉7,5,4,得到638;
正解是:438。

原因:

67确实是升序;
但当我们删掉7以后,N=65438,此时65成了降序!

又如:
N=3456138, S=4
正解应该是:138。

[ 本帖最后由 CrystalFan 于 2009-8-7 01:08 编辑 ]
2009-08-07 00:44
谁是王者
Rank: 2
等 级:论坛游民
帖 子:211
专家分:92
注 册:2009-3-3
收藏
得分:40 
从左向右看左比右大的左删掉。。当删掉一个后再从头开始循环左比右大的左删掉。。。直到删的再没有左比右大的了。如果还没满足位数就就直接从后面去掉x位以满足需要。。。。
如N=3456138, S=4
先删5
在从头循环删6
在从头循环删4
然后是3
最后就是138
如此时S=5;因为138中没有左比右大的了
所以直接从后面去掉一位即可。。得13
再说一下上边的例子
N=675438  S=3
开始循环,左比右大左删,删掉7
从头开始循环左比右大删掉6
再删就是5
剩下438


2009-08-07 01:40
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:0 
完整代码(已改正):

感谢13楼 godbless帮忙找到程序的错误!
程序代码:
#include<stdio.h> 
#include<string.h> 
#define MAX_LENGTH 240 

 
void main() 
{ 
    char s[MAX_LENGTH+1],res[MAX_LENGTH+1];    /*res保存运行结果*/ 
    char *pOut=res;                            /*pOut用于输出,因为最后要过滤高位的0*/ 
    int count,i=0,j=0;  
    scanf("%s%d",s,&count); 
    if((unsigned)count>strlen(s))  
    { 
        printf("You can\'t delete %d numbers from this string which contains only %d numbers!\n",count,strlen(s)); 
        return; 
    } 
    else if((unsigned)count==strlen(s)) 
    { 
        printf("0\n"); 
        return; 
    } 
    while(count) 
    { 
        while(s[i]<=s[i+1])                    /*如果是升序,将s直接拷贝到res,直到遇到降序*/ 
            res[j++]=s[i++]; 
        i++;                                /*遇到降序则跳过一个字符*/ 
        count--;                            /*表示成功删除一个*/ 
        res[j]=s[i++]; 
        while(res[j]<res[j-1]&&count)       /*删掉一个书之后,往回找比下一个数大的*/ 
        { 
            res[j-1]=res[j];                /*从res中删掉新产生的降序数字*/ 
            j--; 
            count--; 
        } 
        i--;                        /*i要重新指向已拷贝的有效字符的下一个位置,要将前一个字符重新判断*/ 
         
    } 
    while((unsigned)i<strlen(s))/*若删降序时,已经删满所需数量,把s余下的部分拷贝到res中*/ 
        res[j++]=s[i++]; 
    while(count) 
    { 
        j--; 
        count--; 
    }                            /*如果还没删够,则从末尾开始删去字符*/ 
    res[j]='\0'; 
    while(*pOut=='0') 
        pOut++;                    /*过滤高位的0*/ 
    if(strlen(pOut)==0)            /*删完之后只剩0的情况*/ 
        printf("0\n"); 
    else 
        printf("%s\n",pOut); 
}


[ 本帖最后由 CrystalFan 于 2009-8-7 16:41 编辑 ]
2009-08-07 01:52
谁是王者
Rank: 2
等 级:论坛游民
帖 子:211
专家分:92
注 册:2009-3-3
收藏
得分:0 
#include<stdio.h>
#include<string.h>
int main()
{
    char a[300];
    int b,k,i,n,l,j,x;
    while(scanf("%s %d",a,&b)!=EOF)
    {
        k=0;x=strlen(a)-1;n=1;
        while(n==1)
        {
            l=0;
            for(i=0;i<x;i++)
            {
                if(a[i]>a[i+1]) //找到左比右大
                {
                    for(j=i;j<x;j++)//左边的删掉
                        a[j]=a[j+1]; //向左移位
                    a[x]='\0';k++;l++;x--;// K记录已经删掉的个数。。L记录本次循环是否找到了有左比右大的
                    break;
                }
            }
            if(k==b||l==0)//当K和要求删的数目相同时或者本次循环没有发现左比右大
                n=0; //跳出
        }
        if(k==b) //如相等
            printf("%s\n",a);
        else //不相等
        {
            for(i=0;i<=x-(b-k);i++) //从剩下的X位里面在去掉还差的位数(b-k);
                printf("%c",a[i]);
            printf("\n");
        }
    }
    return 0;
}//以上是我的程序你可以看下、、、、、、
2009-08-07 01:54
谁是王者
Rank: 2
等 级:论坛游民
帖 子:211
专家分:92
注 册:2009-3-3
收藏
得分:0 
至于最后0的情况在输出稍微处理下即可。。从第一个不为0 的数开始输出
2009-08-07 01:58
快速回复:思路有了 就是不懂编
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017971 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved