intさわだんのBlack History

刹那的レジェンドになりたい。

第11回 2012年 日本情報オリンピック 予選 過去問 ソースコード C++

6問目のジグザグ数は闇が生えたのでまだできてないです。
予選はiostream多用するってはっきりわかんだね。


1

#include <bits/stdc++.h>

using namespace std;
const int INF = 100000;
int main(){

	int a=INF,b=INF,t;
	for(int i = 0;i < 3;i++)cin >> t,a = min(a,t);
	for(int i = 0;i < 2;i++)cin >> t,b = min(b,t);
	cout << a+b-50 << endl;
	return 0;
}

2

#include <bits/stdc++.h>

using namespace std;

int main(){

	int n;
	cin >> n;
	int k[102]={0};
	int s[102]={0};
	for(int i = 0;i < n*(n-1)/2;i++){
		int a,b,c,d;
		cin >> a >> b >> c >> d;
		if(c > d){
			k[a] += 3;
		}else if(d > c){
			k[b] += 3;
		}else{
			k[a] += 1;
			k[b] += 1;
		}
		s[a-1] = k[a];
		s[b-1] = k[b];
	}
	sort(s,s+n,greater<int>());
	for(int i = 1;i <= n;i++){
		for(int j = 0;j < n;j++){
			if(s[j] == k[i]){
				cout << j+1 << endl;
				break;
			}
		}
	}
	return 0;
}

3

#include <bits/stdc++.h>

using namespace std;

int main(){

	int n,a,b,c,d[102];
	cin >> n >> a >> b >> c;
	int ans = c / a;
	for(int i = 0;i < n;i++){
		cin >> d[i];
	}
	sort(d,d+n,greater<int>());
	int sum = 0;
	for(int i = 1;i <= n;i++){
		sum += d[i-1];
		ans = max(ans,(c+sum)/(a+b*i));
	}
	cout << ans << endl;
	return 0;
}

4

#include <bits/stdc++.h>

using namespace std;
const int mod = 10000;
int n,k;
int y[102];
int dp[102][4][4];
int main(){
	cin >> n >> k;
	for(int i = 0;i < k;i++){
		int t;
		cin >> t;
		cin >> y[t];
	}
	for(int i = 1;i <= 3;i++){
		if(y[1] >= 1 && y[1] != i)continue;
		dp[1][1][i] = 1;
	}
	for(int i = 2;i <= n;i++){
		for(int j = 1;j <= 3;j++){
			if(y[i] >= 1 && y[i] != j)continue;
			for(int q = 1;q <= 3;q++){
				if(q == j)continue;
				dp[i][1][j] += dp[i-1][1][q] + dp[i-1][2][q];
			}
			dp[i][2][j] += dp[i-1][1][j];
			dp[i][1][j] %= mod;
			dp[i][2][j] %= mod;
		}
	}
	int ans = 0;
	for(int i = 1;i <= 3;i++){
		for(int j = 1;j <= 2;j++){
			ans += (dp[n][j][i]);
			ans %- mod;
		}
	}
	cout << ans % mod << endl;
	return 0;
}

5

#include <bits/stdc++.h>

using namespace std;
int kx[] = {1,1,1,0,-1,0};
int ky[] = {-1,0,1,1,0,-1};
int gx[] = {0,1,0,-1,-1,-1};
int gy[] = {-1,0,1,1,0,-1};
int w,h,ans=0;
int d[110][110];

void dfs(int a,int b){
	d[a][b] = 2;
	for(int i = 0;i < 6;i++){
		int na,nb;
		if(a % 2 == 0){
			na = a + gy[i];
			nb = b + gx[i];
		}else{
			na = a + ky[i];
			nb = b + kx[i];
		}
		if(na >= 0 && na <= h+1 && nb >= 0 && nb <= w+1){
			if(d[na][nb] == 1)ans++;
			if(d[na][nb] == 0)dfs(na,nb);
		}
	}
}



int main(){
	scanf("%d%d",&w,&h);
	for(int i = 1;i <= h;i++){
		for(int j = 1;j <= w;j++){
			scanf("%d",&d[i][j]);
		}
	}
	dfs(0,0);
	printf("%d\n",ans);
	return 0;
}