整除15 问题

8598 整除15 问题
时间限制:300MS 内存限制:1000K 提交次数:0 通过次数:0
语言: not limited
描述
问题描述:
给定一个只包含数字[0..9]的字符串,求使用字符串中的某些字符,构建一个能够整除15的最大的整数。
注意,字符串中的每个字符只能使用一次。
编程任务:
求由给定字符串构建的能够整除15的最大整数。
输入格式
输入数据为一个只包含数字[0..9]字符串,字符串的长度为1~1000。
输出格式
将构建出的最大整数输出。
如果无法构建出能够整除15的整数,请输出
“impossible”
输入样例
02041
输出样例
4200
Hint
从原来的字串中选择出最少最小的数扣除以满足整除3和5的要求。
28
把0~9数分为如下几类:
0,3,6 ,9:这四种数不影响
2,5,8:除3余2
1,4,7:除3余1
这个题目,考虑能否满足整除5的情况,这比较简单,不详述。只要能满足整除5,进行如下步骤:
然后再考虑从原字串中删除最少而且最小的数使得满足整除3。
有以下几种情况:
情况一:
这个数上各位数字和除3余0。不用删除操作。
情况二:
给定的数上各位数字和除3余1。那么只要删除余1的那一类数中最小的一个。如果没有数串中没有余1的数,就删除两个余2的数。
情况三:
给定的数上各位数字和除3余2。那么只要删除余1的那一类数中最小的两个。如果没有数串中没有余1的数,就删除一个最小的余2的数。

最后,剩余的数串以最大的并且以满足整除5的要求输出。在0存在的时候,就按计数的顺序输出即可。如果在数串中没有0,则必须有个5放在个位。


-----------------------------------------------------------------

8598     整除15问题                  (贪心)


#include<stdio.h>

#include"malloc.h"

#include"string.h"

int delet(int *b,int del_1,int del_2,int n)

{
    
    int max,min,i,j;
    
    if(del_2!=-1){
        
        if(del_1<del_2) {min=del_1;max=del_2;}
        
        else {min=del_2;max=del_1;}
        
        for(i=max;i<n-1;i++)
            
        {
            
            b[i]=b[i+1];
            
        }
        
        for(i=min;i<n-2;i++)
            
        {
            
            b[i]=b[i+1];
            
        }
        
    }
    
    else
        
        for(i=del_1;i<n-1;i++)
            
        {
            
            b[i]=b[i+1];
            
        }
    
    return 0;
    
}

int sort(int *b,int m,int five,int zero)

{
    
    int i,j,temp,n;
    
    n=m;
    
    if(zero==-1)
        
    {temp=b[n-1]; b[n-1]=b[five]; b[five]=temp;n=n-1; }
    
    for(i=0;i<n;i++)
        
        for(j=i;j<n;j++)
            
        {
            
            if(b[i]<b[j]) {temp=b[i]; b[i]=b[j]; b[j]=temp; }
            
        }
    
    return 0 ;
    
}

int main()

{
    
    char a[1000];
    
    int i,n,sum=0;
    
    int *b,del_1=-1,del_2=-1;
    
    int low2_1=-1,low2_2=-1,low1_1=-1,low1_2=-1,five=-1,zero=-1,remainder,count5=0;
    
    scanf("%s",&a);
    
    n=strlen(a);
    
    b=(int*)malloc(n*sizeof(int));
    
    for(i=0;i<n;i++)
        
    {
        
        b[i]=a[i]-48;
        
    }
    
    for(i=n-1;i>=0;i--){
        
        sum=b[i]+sum;
        
        if((zero==-1)&&(b[i]==0)) zero=i;
        
        if((five==-1)&&(b[i]==5)) five=i;
        
        if((b[i]==5))count5++;
        
        if(b[i]%3==1)
            
        {
            
            if((low1_1==-1)&&(low1_2==-1))
                
                low1_1=i;
            
            else if((low1_1!=-1)&&(low1_2==-1))
                
                low1_2=i;
            
            else if(!((b[low1_1]==1)&&(b[low1_2]==1)))
                
            {
                
                if(b[i]<b[low1_1]) low1_1=i;
                
                else if(b[i]<b[low1_2]) low1_2=i;
                
            }
            
        }
        
        if(b[i]%3==2)
            
        {
            
            if((low2_1==-1)&&(low2_2==-1))
                
                low2_1=i;
            
            else if((low2_1!=-1)&&(low2_2==-1))
                
                low2_2=i;
            
            else if(!((b[low2_1]==2)&&(b[low2_2]==2)))
                
            {
                
                if(b[i]<b[low2_1]) low2_1=i;
                
                else if(b[i]<b[low2_2]) low2_2=i;
                
            }
            
        }
        
    }
    
    remainder=sum%3;
    
    if((zero==-1)&&(five==-1))
        
        printf("impossible");
    
    else
        
    {
        
        if(remainder==0)
            
        {
            
            sort(b,n,five,zero);
            
            for(i=0;i<n;i++)
                
                printf("%d",b[i]);
            
        }
        
        else{
            
            if(remainder==1)
                
            {
                
                if((low1_1!=-1)&&(low1_2==-1))
                    
                    del_1=low1_1;
                
                else if((low1_1!=-1)&&(low1_2!=-1))
                    
                {if(b[low1_1]<=low1_2) del_1=low1_1;}
                
                else
                    
                {
                    
                    del_1=low2_1;del_2=low2_2;
                    
                }
                
            }
            
            if(remainder==2)
                
            {
                
                if((low2_1!=-1)&&(low2_2!=-1))
                    
                {
                    
                    if((b[low2_1]==5)&&(b[low2_2]>b[low2_1]))
                        
                        del_1=low2_2;
                    
                    else if((b[low2_2]==5)&&(b[low2_1]>b[low2_2]))
                        
                        del_1=low2_1;
                    
                    else
                        
                    {if(b[low2_1]<=b[low2_2]) del_1=low2_1;
                        
                    else del_1=low2_2;
                        
                    }
                    
                }
                
                else if((low2_1!=-1)&&(low2_2==-1)&&(b[low2_1]!=5))
                    
                    del_1=low2_1;
                
                else 
                    
                {del_1=low1_1;del_2=low1_2;}
                
            }
            
            delet(b,del_1,del_2,n);
            
            if(del_2==-1)
                
            {
                
                if((n-1<2)&&(b[0]!=0))
                    
                    printf("impossible");
                
                else
                    
                {sort(b,n-1,five,zero);
                    
                    for(i=0;i<n-1;i++)
                        
                        printf("%d",b[i]);}
                
            }
            
            else
                
            {
                
                if((n-2<2)&&(b[0]!=0))
                    
                    printf("impossible");
                
                else
                    
                {
                    
                    sort(b,n-2,five,zero);
                    
                    for(i=0;i<n-2;i++)
                        
                        printf("%d",b[i]);
                    
                }
                
            }
            
        }
        
    }
    
    return 0;
    
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值