題名はネタ切れ。認めます。
1050
意外と単純なdpだったよ。オーダー見積もりを鍛えなきゃとか思った。
#include <cstdio> #include <climits> #include <algorithm> using namespace std; int main() { int N; scanf("%d",&N); int map[N][N]; for (int i=0; i<N; i++) for (int j=0; j<N; j++) scanf("%d",&map[i][j]); int dp[N][N][N]; for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { int sum = 0; for (int k=j; k<N; k++) { sum += map[i][k]; dp[i][j][k] = sum; } } } int res = INT_MIN; for (int k=0; k<N; k++) { for (int l=k; l<N; l++) { for (int i=0; i<N; i++) { int sum = 0; for (int j=i; j<N; j++) { sum += dp[j][k][l]; res = max(res, sum); } } } } printf("%d\n", res); }
1017
こんなめんどくさい問題!!!コピペですが何か?(;・∀・)
#include <iostream> using namespace std; int main() { while ( true ) { int p[7]; for ( int i=1; i<=6; i++ ) cin >> p[i]; int num = 0; int s1 = 0; int s2 = 0; // 6 num += p[6]; // 5 num += p[5]; s1 += p[5] * 11; // 4 num += p[4]; s2 += p[4] * 5; // 3 num += ( p[3] + 3 ) / 4; switch ( p[3] % 4 ) { case 0: s1 += 0, s2 += 0; break; case 1: s1 += 7, s2 += 5; break; case 2: s1 += 6, s2 += 3; break; case 3: s1 += 5, s2 += 1; break; } // 2 if ( s2 < p[2] ) p[2] -= s2; else s1 += ( s2 - p[2] ) * 4, p[2] = 0; num += ( p[2] + 8 ) / 9; s1 += ( 9 - p[2]%9 ) % 9 * 4; // 1 p[1] -= min( s1, p[1] ); num += ( p[1] + 35 ) / 36; if ( num == 0 ) break; cout << num << endl; } return 0; }
1519
ただのdfs
#include <cstdio> #include <iostream> #include <sstream> using namespace std; string dfs(string str) { int res = 0; if (str.length() == 1) return str; for (int i=0; i<str.length(); i++) { res += str[i] - '0'; } stringstream ss; ss << res; return dfs(ss.str()); } int main() { string num; while (cin>>num) { if (num == "0") break; cout << dfs(num) << endl; } }
1555
定数の扱いがネック
#include <cstdio> #include <iostream> #include <sstream> using namespace std; int main() { int n[9]; while (scanf("%d", &n[0])!=EOF) { for (int i=1; i<9; i++) scanf("%d", &n[i]); bool first = true; string res = ""; for (int i=0; i<8; i++) { if (n[i] == 0) continue; stringstream ss1; ss1 << 8-i; string xstr; if (i == 7) { xstr = "x"; } else { xstr = "x^" + ss1.str(); } if (first) { first = false; if (n[i] == -1) { res += "-" + xstr; } else if (n[i] == 1) { res += xstr; } else { stringstream ss; ss << n[i]; res += ss.str() + xstr; } } else { if (n[i] == -1) { res += " - " + xstr; } else if (n[i] == 1) { res += " + " + xstr; } else if (n[i] < 0) { res += " - "; stringstream ss; ss << -n[i]; res += ss.str() + xstr; } else { res += " + "; stringstream ss; ss << n[i]; res += ss.str() + xstr; } } } if (first) { stringstream ss; ss << n[8]; res += ss.str(); } else { if (n[8] < 0) { stringstream ss; ss << -n[8]; res += " - " + ss.str(); } else if (n[8] > 0) { stringstream ss; ss << n[8]; res += " + " + ss.str(); } } cout << res << endl; } }
1562
ただのdfs
#include <cstdio> #include <iostream> #include <vector> using namespace std; int n, m; vector<string> map(100); int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1}; void dfs(int x, int y) { map[x][y] = '*'; for (int i=0; i<8; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx>=0 && nx<n && ny>=0 && ny<m && map[nx][ny]=='@') { dfs(nx, ny); } } return; } int main() { while (scanf("%d%d", &n, &m)) { if (n == 0 && m == 0) break; for (int i=0; i<n; i++) { cin >> map[i]; } int res = 0; for (int i=0; i<n; i++) for (int j=0; j<m; j++) { if (map[i][j] == '@') { dfs(i, j); res++; } } printf("%d\n", res); } }
2533
LIS。ただの
#include <cstdio> #include <climits> #include <algorithm> using namespace std; int main() { int n; scanf("%d", &n); int a[n]; for (int i=0; i<n; i++) scanf("%d", &a[i]); int dp[n]; fill(dp,dp+n,INT_MAX); for (int i=0; i<n; i++) *lower_bound(dp,dp+n,a[i])=a[i]; printf("%d\n",lower_bound(dp,dp+n,INT_MAX)-dp); }
あ、そうそう。100問達成したよ♪