题意:给你n个数字,组合成为一个数,要求如下:1.该数尽可能的大。2.无前导零。3.奇数。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055
思路:贪心思想,从大到小进行排序,将最小的一个奇数与最后一位进行交换,判断前导零,符合条件即输出结果。
注意点:前导零的判断,主要的hack点。
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
11756095 | 2014-09-29 14:07:12 | Accepted | 5055 | 15MS | 348K | 1186 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio( false );
int num[1005];
int t;
while ( cin >> t )
{
bool flag = false;
for ( int i = 0; i < t; i ++ )
{
cin >> num[i];
if ( num[i] & 1 )
{
flag =true;
}
}
if ( ! flag )//剪枝,判断是否存在奇数
{
cout << "-1" << endl;
continue;
}
flag = false;
int k = -1;
sort ( num, num + t );
for ( int i = 0; i < t; i ++ )
{
if ( num[i] & 1 )
{
k = i;
break;
}
}
if ( k != -1 && num[t - 2] != 0 )//判断前导零
{
for ( int i = t - 1; i >= 0; i -- )
{
if ( k == i )
{
continue;
}
cout << num[i];
}
cout << num[k] << endl;
}
else
{
cout << -1 << endl;
}
}
return 0;
}