数的连接|NOIP1998 T2|贪心算法
【题目链接】TYVJ1873
【最大连接数】
三、最大连接数 (NOIP 1998年提高组决赛第2题 maxnumber.pas)
【问题描述】
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343连成的最大整数为:34331213。又如:n=4时,4个整数7、13、4、246连接成的最大整数为7424613。
【输入文件】
两行:第一行单独一个N;第二行N个数。
【输出文件】
一行,连接成的多位数。
【输入样例】
3
13 312 343
【输出样例】
34331213
【分析】
很容易可以想到:数字越大的放在最前面,最后组成的数字将会是最大的。然而这样的想法是错误的(不要问我怎么知道的>_<),不能用贪心?其实是标准选错了。不妨想既然要保证每个数字连接之后最大,那么就保证连接后的数字最大,同时为了保证数据的范围,很容易想到要用字符串来存储数据(不然会爆的~)。
在C++中可以很轻松的将两个字符串连接起来,即使用运算符“+”,如:对于字符串”123”和”72”, ”123” + “72” = “12372”, “72” + ”123” = “72123”;
如此只要比较两个字符串相加后的结果就好啦~
【代码】
1 #include <string> 2 3 #include <vector> 4 5 #include <iostream> 6 7 8 9 int main() { 10 11 std::vector<std::string> num; 12 13 int n = 0; 14 15 std::cin>>n; 16 17 for(int i = 0; i < n; i++) { 18 19 std::string tmp; 20 21 std::cin>>tmp; 22 23 num.push_back(tmp); 24 25 } 26 27 for(int i = 0; i < n-1; i++) { 28 29 for(int k = i+1; k < n; k++) { 30 31 if(num[i]+num[k] < num[k]+num[i]) { 32 33 std::string tmp = num[i]; 34 35 num[i] = num[k]; 36 37 num[k] = tmp; 38 39 } 40 41 } 42 43 } 44 45 for(int i = 0; i != num.size(); i++) { 46 47 std::cout<<num[i]; 48 49 } 50 51 }

浙公网安备 33010602011771号