最近也是發覺題目不知道的知識點增多 對於題目的理解也有明顯的提升 加油
A - Buildings
題意:
有n個建築物 觀察是否存在建築物是比最左邊的要高 輸出它的索引 如果不 輸出-1
Code:
#include<bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << ": " << x << '\n'; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, h, x; cin >> n >> h; for (int i = 2; i <= n; i++) { cin >> x; if (x > h) { cout << i << '\n'; return 0; } } cout << -1 << '\n'; return 0; }
B - AtCoder Amusement Park
題意:
相當於一個船 透過遍歷只要該船<=k(容量)的時候做一個船直至沒有人的時候 稍微模擬一下即可
Code:
#include<bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << ": " << x << '\n'; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; int ans = 0, cnt = 1; for (int i = 1, x; i <= n; i++) { cin >> x; if (ans + x <= m) ans = ans + x; else cnt ++, ans = x; } cout << cnt << '\n'; return 0; }
C - Sigma Problem
題意很簡單 就是對於所有對 兩個相加取餘1e8的總和 可以透過打表找到規律
map <int, int> mp; void get() { for (int i = 1; i < 20; i++) { for (int j = i + 1; j <= 20; j++) { mp[i] ++; mp[j] ++; } } for (auto [x, y] : mp) { cout << x << " : " << y << '\n'; } }
可以透過幾個例子推出 在不確定的時候 不去考慮餘數的情況 sum * (n - 1) 我們再去考慮餘數的情況 因為<1e8是val的極限 因此只要減去inf即可 進行統計 可使用多種方法求解
Code1(雙指標):
#include<bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << ": " << x << '\n'; const int N = 3e5 + 5, inf = 1e8; typedef long long i64; int a[N], n, j; i64 ans = 0, cnt = 0; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; ans += a[i] * 1LL; } ans *= (n - 1) * 1LL; sort(a + 1, a + n + 1); j = n; for (int i = 1; i <= n; i++) { while (a[i] + a[j] >= inf) j--; cnt += min(n - j, n - i) * 1LL; } cout << ans - cnt * inf << '\n'; return 0; }
Code2(二分):
#include<bits/stdc++.h> using namespace std; #define debug(x) cerr << #x << ": " << x << '\n'; const int N = 3e5 + 5, inf = 1e8; typedef long long i64; int a[N], n, j; i64 ans = 0, cnt = 0; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; ans += a[i] * 1LL; } ans *= (n - 1) * 1LL; sort(a + 1, a + n + 1); j = n; for (int i = 1; i <= n; i++) { auto it = lower_bound(a + i + 1, a + n + 1, inf - a[i]) - a; cnt += (n - it + 1) * 1LL; } cout << ans - cnt * inf << '\n'; return 0; }