# Greedy# Math# Iteration

d040 - 11207 - The easiest way

🔗 前往 ZeroJudge 原題

題目描述

題目要求從 N 張長方形紙張中選出最適合製作紙鳥的紙張。紙鳥需要正方形紙張,且需要製作 4 隻相同的紙鳥。目標是找到能製作出最大紙鳥的紙張,如果有多個最佳選擇,則輸出紙張的編號最小的那張。

解題思路

對於每張紙張,計算可以製作的最大正方形紙張的邊長。計算方式如下:

  1. 確保寬度小於等於高度。
  2. 如果高度大於等於寬度的 4 倍,則最大正方形邊長為寬度。
  3. 否則,如果高度大於等於寬度的 2 倍,則最大正方形邊長為高度除以 4。
  4. 否則,最大正方形邊長為寬度除以 2。 在計算完所有紙張的最大正方形邊長後,找到最大邊長,並輸出對應的紙張編號。如果有多個紙張具有相同的最大邊長,則輸出第一個出現的紙張編號。

複雜度分析

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

程式碼

#include <iostream>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	while(cin >> n){
		if(n==0)break;
		float a[n][3],ans=0;
		for(int i=0;i<n;++i){
			cin >> a[i][0] >> a[i][1];
			if(a[i][0]>a[i][1]){
				float tmp=a[i][0];
				a[i][0]=a[i][1];
				a[i][1]=tmp;
			}
			if(a[i][1]>=a[i][0]*4)
				a[i][2]=a[i][0];
			else if(a[i][1]>=a[i][0]*2)
				a[i][2]=a[i][1]/4;
			else
				a[i][2]=a[i][0]/2;
			ans=max(ans,a[i][2]);
		}
		for(int i=0;i<n;++i){
			if(ans==a[i][2]){
				cout << i+1 << "\n";
				break; 
			}
		}
	}
}

Discussion