Particle

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

ARC #006

A.
バグらないように全探索しましたが、バグりました。
bool型の配列を使って、当選番号にO(1)でアクセスできるようにしたほうが良かったと思います。

int main(){
	int a[6],b[6],c,ans=0,l=0;
	for(int i = 0; i < 6; i++)cin>>a[i];
	cin>>c;
	for(int i = 0; i < 6; i++)cin>>b[i];
	for(int i = 0; i < 6; i++){
		for(int j = 0; j < 6; j++){
			if(a[i]==b[j]){
				ans++;
			}
			else l += b[j]==c;
		}
	}
	if(ans==6)cout<<1;
	else if(ans==5&&l)cout<<2;
	else if(ans==5)cout<<3;
	else if(ans==4)cout<<4;
	else if(ans==3)cout<<5;
	else cout<<0;
	cout<<endl;
	return 0;
}

B.
下から辿っていくだけですが、実装が少し難しいです。

string s[100];
int N,L;

int main(){
	cin>>N>>L;
	cin.ignore();
	for(int i = 0; i <= L; i++){
		getline(cin,s[i]);
	}
	//for(int i = 0; i <= L; i++)cout<<s[i]<<endl;
	int posi=L-1,posj;
	for(int i = 0; i < (2*N)-1; i++){
		if(s[L][i]=='o'){
			posj=i;
			//cout<<posj<<endl;
		}
	}
	while(posi>=0){
		if(posj>0&&s[posi][posj-1]=='-')posj-=2;
		else if(posj<2*N-2&&s[posi][posj+1]=='-')posj+=2;
		posi--;
		//cout<<posj<<endl;
	}
	cout<<(posj/2+1)<<endl;
	return 0;
}

C.
貪欲法で解けます。毎回ソートしましたが、前から見て行って、置ける場所に置けばいいようです。

int N,w[50],ans=0;
vector<int> M;
int main(){
	cin>>N;
	for(int i = 0; i < N; i++)cin>>w[i];
	M.push_back(w[0]);
	ans++;
	for(int i = 1; i < N; i++){
		sort(M.begin(),M.end());
		for(int j = 0; j <= ans; j++){
			if(j==ans){
				M.push_back(w[i]);
				ans++;
			}
			if(w[i]<=M[j]){
				M[j]=w[i];
				break;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

D.
oの数を数えて、どれに平方数を掛けたやつなのかが分かれば良かったみたいです。

129thでした