kmjp's blog

競技プログラミング参加記です

Codeforces #249 Div2 C. Cardiogram

CF249に参加。ABCDを解いた…と思ったらCでデバッグ時のコードを残してしまいミス。
Eは最初時間切れかと思ったけど、そもそも解法が誤ってた。
http://codeforces.com/contest/435/problem/C

問題

N要素の整数A[i]がある。
ここから2次元座標上に0~N番の(N+1)点を生成する。
i番目の点の座標は(\sum_{j=0}^{i-1} A_j, \sum_{j=0}^{i-1} (-1)^{j+1} A_j)である。

これらの座標を連結した一連の線分をアスキーアートで描画せよ。

解法

A[i]の合計は1000以下なので、グラフの線は(0,-1000)~(1000,1000)の領域にしか来ない。
よってその分のchar配列を準備して線を配置していくだけ。

最後に、線が配置された行だけを出力する。

int N;
char S[2002][2002];

void solve() {
	int f,i,j,k,l,x,y,x2,y2,s=0;
	
	cin>>N;
	FOR(x,2002) FOR(y,2002) S[x][y]=' ';
	x=0;y=1001;
	FOR(i,N) {
		cin>>j;
		s+=j;
		FOR(f,j) {
			if(i%2) S[y][x]='\\';
			else S[y][x]='/';
			
			x++;
			if(f!=j-1) {
				if(i%2) y++;
				else y--;
			}
		}
	}
	FOR(y,2002) S[y][s]=0;
	FOR(y,2002) if(count(S[y],S[y]+s,' ')!=s) printf("%s\n",S[y]);
}