pat甲級 1037 Magic Coupon (25 分) (貪心)

題目鏈接:傳送門

思路:把兩個給出的組存入數組,從小到大排序,然後先從0下標開始計算負數,兩兩配對,然後算正數,同理。 有一個需要注意的點我本來是隻是從0-n-1掃描一遍,把正數加入答案的,扣了幾分,因爲配對順序可能會錯,本來應該最大的正數相乘,而這樣做結果可能會變小。

代碼:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll; 

vector <ll> va , vb;

int main() {
	int nc , np , t;
	ios::sync_with_stdio(0);
	cin >> nc;
	for(int i = 0 ; i < nc ; i++) {
		cin >> t;
		va.push_back(t);
	}
	cin >> np;
	for(int i = 0 ; i< np ; i++) {
		cin >> t;
		vb.push_back(t);
	}
	sort(va.begin() , va.end());
	sort(vb.begin() , vb.end());
	ll ans = 0;
	for(int i = 0 , j = 0 ; i < va.size() && j < vb.size() ; i++ , j++) {
		if(va[i] < 0 && vb[j] < 0)ans += va[i] * vb[j];
		else break;
	}
	for(int i = va.size() - 1 , j = vb.size() - 1 ; i >= 0 && j >= 0 ; i-- , j--) {
		if(va[i] > 0 && vb[j] > 0)ans += va[i] * vb[j];
		else break;
	}
	cout << ans << "\n";
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章