SRM381 div2 hard
ソース31行目以降の説明
if(numbers[j]+numbers[j+1]<numbers[j+1]+numbers[j]) swap(numbers[j],numbers[j+1]);
↑の理由
97799999と999とか前の部分(977と999)が等しくない場合
ーーーーー明らかに999のほうが前
33355555と333とか前の部分(333)が等しい場合
ーーーーー並べ方は2通りしかないんだから試せばいい
バブルソートっていうところがミソ
分からなかったんだけどTopCoder Statisticsで分かった
#include <algorithm> #include <cstdio> #include <sstream> #include <string> #include <vector> using namespace std; class TheNumbersLord { public: string create(vector <int> input, int n) { int m=input.size(),greatest=0; string gs; vector<string> numbers(m); for(int i=0;i<m;i++) { char s[100]; sprintf(s,"%d",input[i]); numbers[i]=s; if(greatest<input[i]) gs=numbers[i],greatest=input[i]; } printf("gs=%s",gs.c_str()); while(numbers.size()!=n) numbers.push_back(gs); //ここから説明します for(int i=0;i<n;i++) for(int j=0;j<n-1;j++) if(numbers[j]+numbers[j+1]<numbers[j+1]+numbers[j]) swap(numbers[j],numbers[j+1]); string ans; for(int i=0;i<n;i++) ans+=numbers[i]; return ans; } };