************************************************************
https://onlinejudge.u-aizu.ac.jp/#/chal ... Trial/0584
※以下引用
************************************************************入力ファイルの1行目に正整数 n (n≧3)が書いてあり、
つづく n 行に異なる正整数 a1, ..., an が 1つずつ書いてある。
a1, ..., an から異なる2個を選んで作られる順列を
(数として見て)小さい順に並べたとき、3番目に来るものを出力せよ。
ただし、例えば、a1 = 1, a4 = 11 のような場合も、a1a4 と a4a1 は異なる順列とみなす。
また、1 ≦ ai ≦ 10000 (i = 1, ..., n) かつ 3 ≦ n ≦ 10000 である。
出力ファイルにおいては, 出力の最後にも改行コードを入れること。
// Sample Input 1
3
2
7
5
// Sample Output 1
52
// Sample Input 2
4
17
888
1
71
// Sample Output 2
171
コードを Ideone.com (C++14) で
入力例を用いチェックしたところ、出力された数字は
サイトに記載されていた出力例と同じだったのですが、
自動審判に使われるデータではおかしな値が出力されました。
(autojudge.txt 参照)
自身で調べて改良を加えているものの一向に改善する気配がありません。
環境は C++ gcc 5.1.1 20150422 (Red Hat 5.1.1-1) です。
些細なミスだと思いますが自身では気づけていないので、改良点を教えて下さい。
(C++ に慣れてきている段階なので可読性などの些細な点には目をつぶって頂けると幸いです)
#define _USE_MATH_DEFINES
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct calc {
int x, y;
int digit(int x);
int permutation(int y);
};
int calc::digit(int n) {
int num = 0;
while (n / 10 > 1) {
n /= 10;
num++;
}
return num;
}
int calc::permutation(int o) {
int data_num[o];
int temp = 0;
vector<int> data_all(o * (o - 1));
for (int i = 0; i < o; i++) {
cin >> data_num[i];
}
for (int i = 0; i < o; i++) {
for (int j = 0; j < o; j++) {
if (i != j) {
int digit_num = calc::digit(data_num[i]) + calc::digit(data_num[j]) + 1;
data_all[temp] = data_num[i] * pow(10, digit_num) + data_num[j];
temp++;
}
}
}
sort(data_all.begin(), data_all.end());
int answer = data_all[2];
return answer;
}
int main() {
int a;
cin >> a;
calc obj_calc;
cout << obj_calc.permutation(a) << endl;
return 0;
}