加油!把KMP和AC自动机拿下!
这题主要利用两个数可以比较大小的三个性质。
(1)自反性 aa = aa
(2) 对称性 如果a <b 则ab<ba ba > ab
(3) 传递性 如果a < b,则ab < ba
因为拼接好的字符串满足这个性质,所以可以比较大小
还有最直观的想法是影响判断一个数最大的影响因素是它的长度,如果把字符串拼接
在一起则长度相同,比较一下大小应该就能清楚的判断两个字符串在前面益处更大,
按升序排好应该就是最小的数,
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char array[1001][1001];
char temp[1001];
char temp1[2001], temp2[2001];
bool compare(char* a1, char* a2)
{
char *p1 = a1, *p2 = a2, *p3 = temp1;
while(*p1 != '\0')
{
*p3 = *p1;
p1++; p3++;
}
while(*p2 != '\0')
{
*p3 = *p2;
p2++; p3++;
}
*p3 = '\0';
p1 = a1, p2 = a2, p3 = temp2;
while(*p2 != '\0')
{
*p3 = *p2;
p2++; p3++;
}
while(*p1 != '\0')
{
*p3 = *p1;
p1++; p3++;
}
*p3 = '\0';
if(strcmp(temp1, temp2) > 0)
return true;
return false;
}
void ShellSort(int length)
{
int d = length/2;
int i, j;
char *p1, *p2;
while(d>=1)
{
for(i=d;i<length;i++)
{
p1 = temp, p2 = array[i];
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
j=i-d;
while(j>=0 && compare(array[j], temp) > 0)
{
p1 = array[j+d], p2 = array[j];
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
j=j-d;
}
p1 = array[j+d], p2 = temp;
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
}
d= d/2;
}
}
int main()
{
int size, i;
while(1)
{
cin >> size;
if(size == 0)
break;
for(i = 0; i < size; i++)
cin >> array[i];
ShellSort(size);
for(i = 0; i < size; i++)
cout << array[i];
cout << endl;
}
return 0;
}
2、整数拼数
问题描述
给你n个整数,用这n个数拼成一个超长的整数,要令这个新的整数最小
例如: 11 110 123 拼出的最小数为:11011123
例如: 123 11 11 拼出的最小数为:1111123
输入
第一行为n(1<=n<=1000),接下来是n个正整数,使用空格或者换行分开,
每个数字的长度不会超过1000,不存在前导0;
当n为0时结束程序
输出
对于每组输入,输出拼成的新的整数的结果。
输入样例
3
987 123 190
输出样例
123190987