fork download
  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3. typedef long long ll;
  4. using namespace std;
  5.  
  6. const ll MAXN = 1e7 + 7;
  7. ll a[MAXN], m[MAXN];
  8.  
  9. void sol() {
  10. ll n, ans = 0;
  11. cin >> n;
  12. for (ll i = 1; i <= n; i++) {
  13. cin >> a[i];
  14. }
  15.  
  16. /*
  17.   Ý tưởng của bài này là:
  18.   Biến ans: Là tổng phi tiêu anh cần mua
  19.   Anh có mảng là m[] với
  20.   m[i] là số phi tiêu đang ở độ cao thứ i
  21.   Em sẽ duyệt for từng trái bóng một.
  22.   Trường hợp 1: Nếu quả bóng thứ i có m[i] > 0 có nghĩa là hiện tại ở vị trí thứ i
  23.   đang có phi tiêu. => có thể phá vỡ quả bóng đó mà không cần mua thêm phi tiêu => sau
  24.   khi quả bóng đó vỡ thì m[i] = 0 vì phi tiêu sẽ hạ độ cao nên m[i - 1]++;
  25.   Trường hơp 2: Nếu quả bóng thứ i có m[i] = 0 có nghĩa là hiện tại ở vị trí thứ i
  26.   đang không có phi tiêu. => để phá vỡ thì phải mua 1 phi tiêu nên ans++ là mua thêm 1 phi tiêu
  27.   sau khi phi tiêu đó làm vỡ quả bóng thứ i thì hạ độ cao nên m[i - 1]++;
  28.  
  29.   Kết quả cuối cùng là ans rồi in ra thôi
  30.   */
  31. for (ll i = 1; i <= n; i++) {
  32. if (m[a[i]] == 0) {
  33. m[a[i] - 1]++;
  34. ans++;
  35. } else {
  36. m[a[i]]--;
  37. m[a[i] - 1]++;
  38. }
  39. }
  40. cout << ans << endl;
  41. }
  42.  
  43. int main() {
  44. ios_base::sync_with_stdio(false);
  45. cin.tie(0);
  46. cout.tie(0);
  47.  
  48. //freopen("DART.INP", "r", stdin);
  49. //freopen("DART.OUT", "w", stdout);
  50.  
  51. ll t = 1;
  52. //cin >> t;
  53. while (t--) {
  54. sol();
  55. }
  56.  
  57. return 0;
  58. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
0