题意:每天领取的金币数按“每个正整数 k 连续领取 k 天”的模式分配,给定天数 n,求累计金币总数。
考点:数学归纳与分段求和、前缀和/模拟、分块累加优化。
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
int k;
while (cin >> k) {
int now = 1, ans = 0;
while (k >= now) {
k -= now;
ans += now * now;
++now;
}
ans += now * k;
cout << ans << endl;
}
}
#include <cstdio>
#include <iostream>
using namespace std;
const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int n, m;
char s[105][105];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
scanf("%s", s[i]);
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j)
if (s[i][j] == '?') {
int ans = 0;
for (int k = 0; k < 8; ++k) {
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && x < n && y >= 0 && y < m && s[x][y] == '*') {
++ans;
}
}
s[i][j] = '0' + ans;
}
}
for (int i = 0; i < n; ++i)
printf("%s\n", s[i]);
}
#include <bits/stdc++.h>
using namespace std;
int n;
int a[50][50];
int main() {
scanf("%d", &n);
int x = 1, y = (n + 1) / 2;
a[x][y] = 1;
for (int i = 2; i <= n * n; i++) {
if (x == 1 && y != n)
x = n, y++;
else if (x != 1 && y == n)
x--, y = 1;
else if (x == 1 && y == n)
x++;
else if (!a[x - 1][y + 1])
x--, y++;
else
x++;
a[x][y] = i;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
printf("%d%c", a[i][j], (j < n) ? ' ' : '\n');
}
#include <bits/stdc++.h>
using namespace std;
#define N 200010
#define rep(i, l, r) for (int i = l; i <= r; ++i)
int n;
int a[N];
int fa[N];
int getfa(int x) {
return x == fa[x] ? x : fa[x] = getfa(fa[x]);
}
bool Union(int x, int y) {
x = getfa(x);
y = getfa(y);
if (x == y) return false;
fa[x] = y;
return true;
}
int walk(int x) {
int ans = 0, y = x;
while (true) {
y = a[y];
++ans;
if (y == x) break;
}
return ans;
}
int main() {
scanf("%d", &n);
rep(i, 1, n) scanf("%d", a + i), fa[i] = i;
int ans = ~0U >> 1;
rep(i, 1, n) if (!Union(i, a[i]))
ans = min(ans, walk(i));
printf("%d\n", ans);
}
#include <bits/stdc++.h>
using namespace std;
#define N 50010
#define rep(i, l, r) for (int i = l; i <= r; ++i)
int a[N];
int n, m, H;
bool ok(int len) {
int last = 0, i = 0, ans = 0;
while (true) {
while (i <= n && a[i] - last < len) ++i;
if (i > n) break;
++ans;
last = a[i];
}
if (ans > 0 && H - last < len) --ans;
return n - ans <= m;
}
int main() {
scanf("%d%d%d", &H, &n, &m);
rep(i, 1, n) scanf("%d", a + i);
int l = 1, r = H;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if (ok(mid))
l = mid;
else
r = mid - 1;
}
printf("%d\n", l);
}