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;
			}
		}
	}
}