22行代碼AC——習題5-6 對稱軸(Symmetry,UVa1595)——解題報告

勵志用盡量少的代碼做高效的表達。


題目(提交)鏈接→UVa-1595


思路:

此題本質是一道笛卡爾座標系上的對稱性問題。
判定性問題:由於只要能判別圖像是否左右對稱即可,無需確認關於哪條垂直線對稱,那麼問題可以這樣解決:將座標升序排序後,若兩側座標和都等於sum,再判斷二者y值相同。就說明關於某條線對稱。
最開始想到用pair結構體,p.first存儲x座標,p.second存儲y座標。重寫cmp()函數,利用sort()pair進行升序排序, (x1+x2)/2求出sum,依次比較,若符合條件,則輸出。
但這個想法是有bug的:
錯誤:(x1+x2)/2可能是小數,而sum是int型,造成數據不準確。 解決辦法:減法代替除法(座標運算儘量避免除法),具體見代碼第15行。
待優化:用set<pair<int,int>>s; 代替pair<int,int>p+sort()。提高效率。
下面是優化後的代碼:

代碼:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n; cin >> n; while(n--) {
		int m,x,y; cin >> m; 
		set<pair<int,int>>st;
		int Min = 20000, Max = -20000;
		for(int i = 0; i < m; i++) {
			cin >> x >> y; 
			Max = max(x,Max); Min = min(x,Min);
			st.insert({x,y});
		}
		bool flag = false;
		for(auto p : st) {
			auto t = make_pair((Max+Min)-p.first,p.second);	//auto的意思是自動識別類型,可以是任何類型 
			if(!st.count(t)) { flag = !flag; break; }
		}
		cout << (flag ? "NO\n" : "YES\n");
	} 
	return 0;
}

收穫:

1、set<pair<int,int>>p:升序結構體。
2、關於座標對稱性的判定問題。
3、座標運算儘量不要使用除法。


擇苦則安,擇做則樂(閒)。虛擬終究比不過真實精彩之萬一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章