# Sorting# Struct# Comparison

d092 - 算式也可以比大小!?

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取 n 組數字對 (a, b),計算 a + b 的和,並根據 a 和 b 的大小關係將結果表示為 ">c", "=c", "<c" 的形式,其中 c 是 a + b 的和。然後,將這些表示形式的結果按照 c 的大小降序排列,如果 c 的大小相同,則按照 ">c" > "=c" > "<c" 的順序排列。

解題思路

首先,定義一個結構體 c,包含兩個成員:p 表示 a 和 b 的大小關係(1 表示 a > b,-1 表示 a < b,0 表示 a = b),v 表示 a + b 的和。 然後,讀取 n 組數字對,計算 a + b 的和,並設定結構體的 pv 值。 接著,使用 sort 函數對結構體數組進行排序。排序的比較函數 cmp 首先比較 v 的大小,如果 v 相等,則比較 p 的大小,按照 ">c" > "=c" > "<c" 的順序排列。 最後,遍歷排序後的數組,根據 p 的值輸出 ">c", "=c", "<c",並輸出 c 的值。

複雜度分析

  • 時間複雜度: O(n log n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
struct c{
	int p;
	int v;
};
bool cmp(c a,c b){
	if(a.v==b.v)
		return a.p>b.p;
	return a.v>b.v;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n,x,y;
	while(cin >> n){
		if(n==0)break;
		c a[n];
		for(int i=0;i<n;i++){
			cin >> x >> y;
			if(x>y)
				a[i].p=1;
			else if(x<y)
				a[i].p=-1;
			else
				a[i].p=0;
			a[i].v=x+y;
		}
		sort(a,a+n,cmp);
		for(int i=0;i<n;i++){
			if(a[i].p==1)
				cout << '>';
			else if(a[i].p==0)
				cout << '=';
			else
				cout << '<';
			cout << a[i].v << " ";
		}
		cout << "\n";
	}
}

Discussion