SRM 574 div2 (と科学の甲子園参加記)

第2回科学の甲子園に出場してきました。入賞できてよかった(小並感)
情報分野担当だったが、あまり力を出しきれなかった感があって残念。
実技3が事前公開だったはずなのに、自分たちのチームだけ知らなかった。そのプログラムを前日の夜に書いたが、バグらせてしまい申し訳なかった。
先輩方やもう一人の同学年の人がとてもがんばってくださったので、思っていたよりも上位になっていてチームのみんなで驚いていた。
高級金平糖がおいしかった。

帰宅した日の夜にTopCoderをやった。
933 -> 960
medの場合分けが難しくて再提出した。

easy

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class CityMap{
public:
	string getLegend(vector <string> cMap, vector <int> POIs){
		int a[26];
		fill(a, a + 26, 0);
		for(int i = 0; i < cMap.size(); i++){
			for(int j = 0; j < cMap[i].size(); j++){
				if(cMap[i][j] != '.'){
					a[cMap[i][j] - 'A']++;
				}
			}
		}
		char ans[100];
		int l = 0;
		fill(ans, ans + 100, 0);
		for(int i = 0; i < POIs.size(); i++){
			for(int j = 0; j < 26; j++){
				if(a[j] == POIs[i]){
					ans[l] = 'A' + j;
					l++;
				}
			}
		}
		return string(ans);
	}
};

med

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

const int INF = 1 << 29;
class TheNumberGameDiv2{
public:
	bool t;
	int solve(vector<int> A, vector<int> B){
		int i;
		bool f = true;
		for(i = 0; i < A.size() - B.size() + 1; i++){
			f = true;
			for(int j = 0; j < B.size(); j++){
				if(A[i + j] != B[j]){
					f = false; break;
				}
			}
			if(f) break;
		}
		if(!f) return INF;
		if(i == 0)
			return A.size() - B.size();
		t = true;
		return A.size() - B.size() + 2;
			
	}
	int minimumMoves(int A, int B){
		vector<int> dA;
		vector<int> dB;
		while(1){
			dA.push_back(A % 10);
			A /= 10;
			if(A == 0) break;
		}
		while(1){
			dB.push_back(B % 10);
			B /= 10;
			if(B == 0) break;
		}
		if(dA.size() < dB.size()){ return -1; }

		int ans = INF;

		reverse(dA.begin(), dA.end());
		reverse(dB.begin(), dB.end());
		ans = min(ans, solve(dA, dB));

		reverse(dA.begin(), dA.end());
		t = false;
		int a = solve(dA, dB);
		if(t == true)
			ans = min(ans, a - 1);
		else
			ans = min(ans, a + 1);

		return ((ans > INF-2)?(-1):ans);
	}
};

(追記)当日バグったプログラムがディレクトリの奥から出てきたので載せておく。2つ作っておいたのに両方バグって絶望

init = 0 [init := 1; Z := 0.8; X := 0.3; Y := 0.3;]

c > 31  [cnt := 0; c := 0; t := 0; LED(c);]
cnt = 3 [output(c); cnt := 0; c := 0; LED(c);]

Z > accelZ() [backSpace(); cnt := 0; c := 0; t := 0;
              E := 0; S := 0; W := 0; N := 0; LED(c); ]

X < accelX()  & t = 0         [t := 1; W := 1;]
-X > accelX() & t = 1 & E = 0 [W := 2; c := c * 4 + 3; t := 2; cnt := cnt + 1;]
-X < accelX() & t = 2 & W = 2 [W := 0; t := 0; LED(c);]

-X > accelX() & t = 0         [t := 1; E := 1;]
X < accelX()  & t = 1 & W = 0 [E := 2; c := c * 4 + 2; t := 0; cnt := cnt + 1;]
X > accelX()  & t = 2 & E = 2 [E := 0; t := 0; LED(c);]

Y < accelY()  & t = 0         [t := 1; N := 1;]
-Y > accelY() & t = 1 & S = 0 [N := 2; c := c * 4 + 0; t := 0; cnt := cnt + 1;]
-Y < accelX() & t = 2 & N = 2 [N := 0; t := 0; LED(c);]

-Y > accelY() & t = 0         [t := 1; S := 1;]
Y < accelY()  & t = 1 & N = 0 [S := 2; c := c * 4 + 1; t := 0; cnt := cnt * 1;]
Y > accelX()  & t = 2 & S = 2 [S := 0; t := 0; LED(c);]
init = 0 [init := 1; Z := 0.9; X := 0.9; Y := 0.9; z := 1;]

c = 32  [backSpace(); cnt := 0; c := 0; LED(c);]
c > 32  [cnt := 0; c := 0; LED(c);]
cnt = 2 [output(c); cnt := 0; c := 0; LED(c);]

Z < accelZ() & z = 0         [z :=  1; x := 0; y := 0; c := c * 6 + 0; cnt := cnt + 1; LED(c);]
-Z > accelZ() & z = 0        [z := -1; x := 0; y := 0; c := c * 6 + 1; cnt := cnt + 1; LED(c);]
-Z < accelZ() & accelZ() < Z [z := 0;]

X < accelX() & x = 0         [x :=  1; y := 0; z := 0; c := c * 6 + 2; cnt := cnt + 1; LED(c);]
-X > accelX() & x = 0        [x := -1; y := 0; z := 0; c := c * 6 + 3; cnt := cnt + 1; LED(c);]
-X < accelX() & accelX() < X [x := 0;]

Y < accelY() & y = 0         [y :=  1; x := 0; z := 0; c := c * 6 + 4; cnt := cnt + 1; LED(c);]
-Y > accelY) & y = 0         [y := -1; x := 0; z := 0; c := c * 6 + 5; cnt := cnt + 1; LED(c);]
-Y < accelY() & accelY() < Y [y := 0;]