Particle

競技プログラミングについての雑記

ARC #005

A.
最後と最後以外で場合分けします。(最初の12文字一致で実装するのでも良さそうです。追記:ダメです)

int main(){
	int n,ans = 0;
	string s;
	cin>>n;
	for(int i = 0; i < n-1; i++){
		cin>>s;
		if(s=="TAKAHASHIKUN"||s=="Takahashikun"||s=="takahashikun")ans++;
	}
	cin>>s;
	if(s=="TAKAHASHIKUN."||s=="Takahashikun."||s=="takahashikun.")ans++;
	cout<<ans<<endl;
	return 0;
}

B.
横にはみ出したら、横に反転して、縦にはみ出したら、縦に反転すると、題意を満たします。
反転する所はdx*=-1のようにしたほうが実装量が減ります。

int x,y,dx,dy;
string d,g[9];

void init(){
	x -= 1;y -= 1;
	if(d=="R"){
		dx=1;dy=0;
	}
	if(d=="L"){
		dx=-1;dy=0;
	}
	if(d=="U"){
		dx=0;dy=-1;
	}
	if(d=="D"){
		dx=0;dy=1;
	}
	if(d=="RU"){
		dx=1;dy=-1;
	}
	if(d=="RD"){
		dx=1;dy=1;
	}
	if(d=="LU"){
		dx=-1;dy=-1;
	}
	if(d=="LD"){
		dx=-1;dy=1;
	}
}

void solve(){
	for(int i = 0; i < 4; i++){
		cout<<g[y][x];
		y+=dy;x+=dx;
		if(y<0){
			dy=1;
			y=1;
		}
		if(x<0){
			dx=1;
			x=1;
		}
		if(y>=9){
			dy=-1;
			y=7;
		}
		if(x>=9){
			dx=-1;
			x=7;
		}
	}
	cout<<endl;
}

int main(){
	cin>>x>>y>>d;
	for(int i = 0; i < 9; i++)cin>>g[i];
	init();
	solve();
	return 0;
}

C.
壁を壊した回数を覚えておいて、幅優先探索します。
priority_queueを使ったほうが効率が良さそうなので(出来るだけ壁を壊さないほうが遠くまで行けるから)、priority_queueを使いました。

追記:ダイクストラ法になってました

#define mp make_pair
#define fi first
#define se second

typedef pair<int,pair<int,int> > P;

int h,w,sx,sy,g[500][500],dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
string s[500];


bool val(int y,int x){
	return 0<=y&&0<=x&&y<h&&x<w;
}

int main(){
	cin>>h>>w;
	for(int i = 0; i < h; i++)cin>>s[i];
	for(int i = 0; i < h; i++){
		for(int j = 0; j < w; j++){
			if(s[i][j]=='s'){
				sx = j;
				sy = i;
			}
		}
	}
	priority_queue<P> q;
	q.push(mp(3,mp(sy,sx)));
	while(!q.empty()){
		P p = q.top();
		q.pop();
		int rank = p.fi,py = p.se.fi,px = p.se.se;
		for(int i = 0; i < 4; i++){
			int y = py+dy[i],x = px+dx[i];
			if(val(y,x)){
				if(s[y][x]=='.'&&g[y][x]<rank){
					g[y][x] = rank;
					q.push(mp(rank,mp(y,x)));
				}
				if(s[y][x]=='#'&&g[y][x]<rank-1){
					g[y][x] = rank;
					q.push(mp(rank-1,mp(y,x)));
				}
				if(s[y][x]=='g'){
					cout<<"YES"<<endl;
					return 0;
				}
			}
		}
	}
	cout<<"NO"<<endl;
	return 0;
}

D.
足し算しない場合は、出てきた数字をすべて使えるか調べるだけです。
足し算する場合は分かりません(入力が弱いらしいので、嘘枝刈り+埋め込みでも通せるらしいです)



32ndでした