AOJ 1186 Integral Rectangles (ICPC国内予選2013問題A)
正整数w, h(1 <= w, h <= 100 かつ h < w)が与えられ, (w^2 + h^2, h)と(W^2 + H^2, H)を辞書式順序で比較した際に(H < W)かつ(w^2 + h^2, h)以上で最小の(W^2 + H^2, H)を求め、H, Wを出力する問題です。
解のW, Hはともに150以下であることが保証されているので1以上150以下でH < Wを満たす任意のW, Hについて比較して調べるとよいです。
ペアの比較はC++ならpairを使うと最初から比較が辞書式順序になっているので楽です。
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; typedef pair<int,int> P; int main(){ int w, h; while( cin >> h >> w , h || w ){ pair<P,int> p(P(w*w + h*h, h), w); vector<pair<P,int> > v; for(int h_ = 1; h_ <= 150; h_++){ for(int w_ = 1; w_ <= 150; w_++){ if( h_ < w_ ){ v.push_back( pair<P,int>(P(w_*w_ + h_*h_, h_), w_) ); } } } sort(v.begin(), v.end()); for(int i = 0; i < v.size(); i++){ if( p < v[i] ){ cout << v[i].first.second << " " << v[i].second << endl; break; } } } }