A
數門牌, 找2就完了 624
int main() {
IOS;
rep (i, 1, 2020) {
int cur = i;
while (cur) n += (cur % 10 == 2), cur /= 10;
}
cout << n;
return 0;
}
B
暴力__gcd完事, 記得 1/1, 2481215
int main() {
IOS;
rep (i, 1, 2020) {
rep (j, i + 1, 2020) n += (__gcd(i, j) == 1);
}
cout << (n << 1) + 1;
return 0;
}
C
暴力跑就完了, 一會↗, 一會↙, 走到 x == 1 或者 y== 1拐彎就行, 761
int main() { //761
IOS; bool f = 1;
for (int x = 1, y = 1, k = 1; ; ++k) {
if (x == 20 && y == 20) { cout << k; break; }
if (f)
if (x - 1) --x, ++y;
else ++y, f = 0;
else
if (y - 1) ++x, --y;
else ++x, f = 1;
}
return 0;
}
D
暴力跑, 狀壓就行, 80(跑出81, 是算了 0, 題目要求最少亮一根)
int main() { //80;
IOS;
rep (i, 1, (1 << 7) - 1) {
rep (j, 1, 7) v[j] = 0, f[j] = j;
rep (j, 0, 6) if (i >> j & 1) v[j + 1] = 1;
rep (j, 1, 6) if (v[j] && v[j + 1]) unit(j, j + 1);
if (v[1] && v[6]) unit(1, 6);
if (v[7]) {
if (v[2]) unit(2, 7);
if (v[3]) unit(3, 7);
if (v[5]) unit(5, 7);
if (v[6]) unit(6, 7);
}
bool f = 1;
rep (j, 1, 7) rep (k, j + 1, 7) if (v[j] && v[k] && find(j) != find(k)) f = 0;
n += f;
}
cout << n;
return 0;
}
E
(這道題不確定)
線和圓其實是一樣的, 單考慮純線(圓)
肯定是 第i個線(原) 和前(i - 1)個線(原) 兩兩(重點,兩兩)相交
故 每次多分出 i 個面,
然后合並 圓和線, 肯定是 包住 線交差為出圍出來的區域, 然后和每條直線都相交 一個圓和20條線 多形成 40個區域
所以答案是 1011
int main() {
IOS; ll ans = 1; //最初就是一個面
rep (i, 1, 20) ans += i;
cout << ans + 20 * 40;
return 0;
}
F
sb題
int main() {
IOS;
ll sum = 0, mx = -1, mi = 120;
for (cin >> _; _; --_) cin >> n, sum += n, umin(mi, n), umax(mx, n);
cout << mx << ' ' << mi << ' ' << setiosflags(ios::fixed) << setprecision(2) << sum * 1.0 / n;
return 0;
}
G
這道題 ABCDDCBA 你可以直接枚舉年分, 我是枚舉的 ABCD, 最重要的是判斷日期是否合法
int yue[] = {1, 3, 5, 7, 8, 10, 12};
bool check(int yy, int mm, int dd) {
if (mm > 12) return 0;
bool f = 0; //判斷閏年
if (yy % 100 && yy % 4 == 0) f = 1;
else if (yy % 400 == 0) f = 1;
if (mm == 2) return dd <= 28 + f;
rep (i, 0, 6) if (mm == yue[i]) return dd <= 31;
return dd <= 30;
}
int main() {
IOS; cin >> n; m = 1e9;
rep (i, 1, 9)
rep (j, 0, 9)
rep (p, 0, 9)
rep (q, 0, 9) {
int mm = q * 10 + p, dd = j * 10 + i;
int yy = i * 1000 + j * 100 + p * 10 + q;
if (!check(yy, mm, dd)) continue;
int cur = yy * 10000 + mm * 100 + dd;
if (cur <= n) continue;
umin(m, cur);
}
cout << m << '\n'; m = 1e9;
rep (i, 1, 9)
rep (j, 0, 9) {
int mm = j * 10 + i, dd = mm;
int yy = i * 1010 + j * 101;
if (!check(yy, mm, dd)) continue;
int cur = yy * 10000 + mm * 100 + dd;
if (cur <= n) continue;
umin(m, cur);
}
cout << m;
return 0;
}
H
和南京2018icpc的 j 很像
用 map<char, ll> st 存上一次 char 出現的位置
map<char, ll> ls 存上上一次 ls 出現的位置
默認所有 char 第一次出現在 i == 0(字符串下標從1開始)
然后 O(n) 掃就好了, 總的復雜度用了 map 乘個 log
sb藍橋不讓用unordered, 不然就是個常數
unordered_map<char, ll> st, ls;
char s[N];
int main() {
IOS; cin >> s + 1;
int len = strlen(s + 1);
ll ans = 0;
for (int i = 1; s[i]; ++i) {
int qq = st[s[i]];
if (qq) ans -= (qq - ls[s[i]]) * (len - i + 1);
ans += (i - qq) * (len - i + 1);
ls[s[i]] = qq; st[s[i]] = i;
}
cout << ans;
return 0;
}
I
爬爬爬爬, 計算機和, 還是橢圓, 推公式都要半天, 直接放棄, 平面幾何不帶板子直接過
J
(博客寫着寫着發現寫錯了.........., 只能處理長度<27的, 先放着吧)