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的数。
时间限制: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;
}