1.数字重组
题目描述:
就给出很多个数呗,然后要把这些数随意挨个连在一起,问最终连起来的数最小值是多少
输入:
直接一行,许多个数,用逗号隔开
输出:
输出重组后的数的最小值
样例:
输入:
32,231
输出:
23132
思路:
用0~9开字典树,存起来。最后中序输出就好。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
struct ZDtree
{
int num;
int next[10];
int key;
}node[10010];
int cnt;
char s[10010];
int insert(int i)
{
int id = 1;
int key = 0;
for(;s[i]!=','&&s[i];i++)
{
if(node[id].next[s[i]-'0'] == 0)
node[id].next[s[i]-'0'] = ++cnt;
id = node[id].next[s[i]-'0'];
key = key*10+s[i]-'0';
}
node[id].num++;
node[id].key = key;
return i;
}
int dfs(int id,int from)
{
for(int i=0;i<10;i++)
{
if(i>from)
if(node[id].num > 0)
{
for(int i=1;i<=node[id].num;i++)
printf("%d",node[id].key);
node[id].num = 0;
}
if(node[id].next[i]>0)
dfs(node[id].next[i],i);
}
}
int main()
{
scanf("%s",s);
memset(node,0,sizeof(node));
cnt = 1;
for(int i=0;s[i];i++)
i = insert(i);
/* for(int i=1;i<=cnt;i++)
{
printf("id=%d num=%d key=%d ",i,node[i].num,node[i].key);
for(int j=0;j<10;j++)
printf("%d ",node[i].next[j]);
printf("\n");
}*/
dfs(1,10);
printf("\n");
return 0;
}
考试当天做出来了,AC。但是这题有坑,得用C++14的gcc编译器才能过。C++11超时,什么chang编译器