「題解」Codeforces Round 887 (Div. 2)

A. Desorting

Problem

題目

Sol & Code

若序列一開始無序答案爲 \(0\)

若有序即 \(a_1\leq a_2 \leq \dots \leq a_n\)

若想讓 \(a_i > a_j(i < j)\),操作次數與兩數差值 \(d(d = a_j - a_i)\) 相關爲 \(\lfloor\dfrac{d}{2}\rfloor+1\),差值越小操作次數越少,故枚舉相鄰兩數取最少的操作次數。

時間複雜度爲 \(O(n)\)

#include <bits/stdc++.h>
#define N 501

int T, n, a[N];

int min(int a, int b) { return a < b ? a : b; }

int main() {
  scanf("%d", &T);
  while (T--) {
    int ans = 2147483647;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (int i = 2; i <= n; ++i) {
      if (a[i] < a[i - 1]) { ans = 0; break; }
      else ans = min(ans, (a[i] - a[i - 1]) / 2 + 1);
    }
    printf("%d\n", ans);
  }
  return 0;
}

B. Desorting

Problem

題目

Sol & Code

斐波那契數列

\(x,y\) 是第 \(k\) 項爲 \(n\) 的類斐波那契數列的前兩項,有 \(F[k - 2]x+F[k - 1]y = n\)

枚舉 \(x\) 看是否存在合法的 \(y\)

時間複雜度爲 \(O(n)\)

#include <bits/stdc++.h>

int T, n, k, f[31];

int main() {
  f[0] = 1, f[1] = 1;
  for (int i = 2; i <= 30; ++i) f[i] = f[i - 1] + f[i - 2];
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &n, &k);
    if (k >= 30) {puts("0"); continue; }
    int ans = 0;
    for (int i = 0; i <= n; ++i) {
      if (((n - f[k - 3] * i) % f[k - 2]) == 0 && (n - f[k - 3] * i) / f[k - 2] >= i) ++ans;
    }
    printf("%d\n", ans);
  }
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章