EOJ3003. 最小ベクトル内積

シングルポイント制限時間:  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( n^2) です。演算を簡素化するために、最小の内積は「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;
}   

 

おすすめ

転載: blog.csdn.net/qingxiu3733/article/details/131754807