Delete Numbers
1000(ms)
65535(kb)
1561 / 5095
给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a(n<100) 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。 对于给定的正整数a,编程计算删去k个数字后得到的最小数。
输入
第1 行是1 个正整数a。第2 行是正整数k。
输出
计算出的最小数(输出无前导0)
样例输入
178543 4
样例输出
13
因为输入的时候输入的是连串的数字,所以我用的字符串输入,再转换为数组,虽然有点麻烦,但是还是蛮方便的,如果有更好的方法那就更好了
至于删数的方法是,从左边开始删除大于右边的每一个数字,可能有点方,为什么要这样做呢,emm说实在的我也不知道,但是这个规律是没错的
附上代码~
#include<stdio.h>
int a[100][100];
int n,m,k=0;
void pai(int x)
{
if(k>=n*m)
{
return;
}
int i,j;
for(j=x;j<m-x;j++,k++)
{
if(k>=n*m)
{
break;
}
a[x][j]=k%10;
}
for(i=x+1;i<n-x;i++,k++)
{
if(k>=n*m)
{
break;
}
a[i][m-x-1]=k%10;
}
for(j=m-x-2;j>=x;j--,k++)
{
if(k>=n*m)
{
break;
}
a[n-x-1][j]=k%10;
}
for(i=n-x-2;i>x;i--,k++)
{
if(k>=n*m)
{
break;
}
a[i][x]=k%10;
}
pai(x+1);
}
int main()
{
int q=0;
while(~scanf("%d %d",&n,&m))
{
k=0;
pai(0);
int i,j;
if(q!=0)
{
printf("\n");
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
q++;
}
return 0;
}