シングルポイント制限時間: 2.0秒
メモリ制限: 256 MB
2 つのベクトル a=[a1,a2,⋯,an] と b=[b1,b2,⋯,bn] の内積は次のように定義されます。
たとえば、2 つの 3 次元ベクトル [1,3,−5] と [4,−2,−1] の内積は次のようになります。
各ベクトルの座標値は並び替えが許可されているものとする。すべての順列の中で最小の内積を持つ順列を見つけて、最小の内積値を出力します。
上記の例の 1 つの順列 [3,1,−5] および [−2,−1,4] の内積は -27 であり、これが最小の内積です。
入力フォーマット
1 行目: 整数 T (1⩽T⩽10) は質問の数です。
次に各質問には 3 行が含まれます。行 1 は整数 n (1⩽n⩽1000) で、2 つのベクトルの次元を表します。行 2 と行 3 はそれぞれベクトル a とベクトル b を表します。各ベクトルは、スペースで区切られた n 個の座標値 (−1000 ⩽ 座標値 ⩽ 1000) で構成されます。
出力フォーマット
質問ごとに、質問番号の行を出力します (0 から始まる番号付け、形式:case #0:
など)。
次に、問題ごとに最小の内積値を 1 行に出力します。
サンプル
入力
3 3 3 1 -5 -2 -1 4 1 2 -298 5 1 2 3 4 5 1 0 1 0 1
出力
ケース #0: -27 ケース #1: -596 ケース #2: 6
問題解決のアイデア
次元が n であると仮定すると、A と B に完全な配置を生成させ、それを激しく解く時間計算量は O( ) です。演算を簡素化するために、最小の内積は「vecA の最大数 × vecB の最小数とする」ことができることに注意してください。
したがって、この例では、vecA を昇順にソートし、vecB を降順にソートし、最終的に各ジョブに対応する内積 dotpdt を求めて出力します。
サンプルコード
#include <iostream>
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
class SingleJob{
public:
int dim;
vector<int> vecA;
vector<int> vecB;
};
int main() {
int jobs, temp;
SingleJob J[10];
// 输入
cin >> jobs;
for(int i=0;i<jobs;i++){
cin >> J[i].dim;
for(int j=0;j<J[i].dim;j++){
cin >> temp;
J[i].vecA.insert(J[i].vecA.end(), temp);
}
for(int j=0;j<J[i].dim;j++){
cin >> temp;
J[i].vecB.insert(J[i].vecB.end(), temp);
}
}
// 输出
int dotpdt=0;
for(int i=0;i<jobs;i++){
sort(J[i].vecA.begin() , J[i].vecA.end());
sort(J[i].vecB.rbegin(), J[i].vecB.rend());
cout << "case #" << i << ":" << endl;
for(int j=0;j<J[i].dim;j++){
dotpdt += J[i].vecA[j] * J[i].vecB[j];
}
cout << sql << endl;
dotpdt = 0;
}
return 0;
}