AOJ - Problem 0116 : Area of Polygon
円に内接する2つの多角形の面積の大きさを比較する問題です。
三角形の面積は(半径)*(半径)*sinθ÷2で計算できます。
面積の大きさの比較だけなので半径を1として(÷2)を省略しても問題ないでしょう。
#include <iostream> #include <vector> #include <cmath> using namespace std; int main(){ int m,n; const double pi = 3.14159265358979; const double EPS = 1e-10; while( cin >> m , m ){ int v, angleA=0, angleB=0; vector<int> a,b; for(int i=0 ; i < m-1 ; i++ ){ cin >> v; a.push_back( v ); angleA += v; } cin >> n; for(int i=0 ; i < n-1 ; i++ ){ cin >> v; b.push_back( v ); angleB += v; } a.push_back( 360 - angleA ); b.push_back( 360 - angleB ); double sa=0.0, sb=0.0; for(int i=0 ; i < a.size() ; i++ ){ sa += sin( a[i]*pi/180.0 ); } for(int i=0 ; i < b.size() ; i++ ){ sb += sin( b[i]*pi/180.0 ); } if( fabs(sa-sb) < EPS ) cout << 0 << endl; else if( sa > sb ) cout << 1 << endl; else cout << 2 << endl; } }
AOJ - Problem 0161 : Sport Meet
4種目の合計タイムの合計タイムが1番小さいチームと2番目に小さいチームと2番目に大きいチームのチーム番号を出力します。
ソートするとよいと思います。
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; typedef pair<int,int> P; int main(){ int n; while( cin >> n , n ){ vector<P> vc; for(int i=0 ; i < n ; i++ ){ int c,m1,m2,m3,m4,s1,s2,s3,s4; cin >> c >> m1 >> s1 >> m2 >> s2 >> m3 >> s3 >> m4 >> s4; int time = m1*60 + s1 + m2*60 + s2 + m3*60 + s3 + m4*60 + s4; P p( time , c ); vc.push_back( p ); } sort( vc.begin() , vc.end() ); cout << vc[0].second << endl; cout << vc[1].second << endl; cout << vc[vc.size()-2].second << endl; } }
AOJ - Problem 0151 : Grid
縦横斜めに連続して1が並ぶ列のうち列の長さが最大のものを出力します。全探索するだけでよいようです。
#include <iostream> #include <string> #include <algorithm> using namespace std; int dx[] = {1,0,1,-1}; int dy[] = {0,1,1,1}; int main(){ int n; while( cin >> n , n ){ string f[256]; int ans = 0; for(int i=0 ; i < n ; i++ ){ cin >> f[i]; } for(int y=0 ; y < n ; y++ ){ for(int x=0 ; x < n ; x++ ){ if( f[y][x] == '1' ){ for(int i=0 ; i < 4 ; i++ ){ int mx = x + dx[i]; int my = y + dy[i]; int cnt = 1; while( mx >= 0 && my >= 0 && mx < n && my < n && f[my][mx] == '1' ){ mx += dx[i]; my += dy[i]; cnt++; } ans = max( ans , cnt ); } } } } cout << ans << endl; } }
AOJ - Problem 0128 : Abacus
入力した数値に対応するようなそろばんの配置を出力します。
あらかじめ数字(0-9)ごとの文字列のテーブルをつくっておいて各桁ごとに数字を見ていけばよい思います。
#include <iostream> #include <string> using namespace std; string f[10] = { "* = ****", "* =* ***", "* =** **", "* =*** *", "* =**** ", " *= ****", " *=* ***", " *=** **", " *=*** *", " *=**** " }; int main(){ string s; bool flag = false; while( cin >> s ){ string ans[10]; if( flag ){ cout << endl; }else{ flag = true; } while( s.size() < 5 ){ s = "0" + s; } for(int i=0 ; i < s.size() ; i++ ){ ans[i] = f[s[i]-'0']; } for(int x=0 ; x < 8 ; x++ ){ for(int y=0 ; y < s.size() ; y++ ){ cout << ans[y][x]; } cout << endl; } } }
AOJ - Problem 0124 : League Match Score Sheet
各チーム毎に勝ち点をそれぞれ勝(3点)、負(0点)、引分(1点)で計算し、勝点の高いチームから順にチーム名と勝点を出力します。
勝点が同じときは入力の順に出力することに気をつけてソートしましょう。
#include <iostream> #include <vector> #include <map> #include <string> #include <algorithm> using namespace std; int main(){ int n; bool flag = false; while( cin >> n , n ){ vector<int> vc; map<int,vector<string> > f; if( flag ){ cout << endl; }else{ flag = true; } for(int i=0 ; i < n ; i++ ){ string name; int a,b,c; cin >> name >> a >> b >> c; int p = -(a*3 + c); if( count(vc.begin(),vc.end(),p) == 0 ){ vc.push_back( p ); } f[p].push_back( name ); } sort( vc.begin() , vc.end() ); for(int i=0 ; i < vc.size() ; i++ ){ for(int j=0 ; j < f[vc[i]].size() ; j++ ){ cout << f[vc[i]][j] << "," << -vc[i] << endl; } } } }