第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; }