9.25 总结

T1 变换

一道DP题,用 fi,j,0/1 来表示到了第 i 个数,总共修改了 j 次,前面的数是/不是山谷点,做 DP 即可。

赛事想到前面是不是山谷点的情况但是直接忽略力(悲)

#include <fstream>

using namespace std;
using ll = long long;

const int kMaxN = 2001;

ifstream cin("change.in");
ofstream cout("change.out");

ll n, k, a[kMaxN], dp[kMaxN][kMaxN][2], maxn[kMaxN];

int main() {
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  ll ans = 0;
  for (int i = 2; i < n; i++) {
    for (int j = 0; j <= k; j++) {
      if (a[i] < a[i - 1] && a[i] < a[i + 1]) {
        dp[i][j][1] = dp[i - 1][j][0] + a[i];
        dp[i][j][0] = dp[i - 1][j][1];
      } else {
        if (j != 0) {
          dp[i][j][1] = dp[i - 1][j - 1][0] + min(a[i - 1] - 1, a[i + 1] - 1);
        }
        dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);
      }
      ans = max(ans, dp[i][j][0]);
      ans = max(ans, dp[i][j][1]);
    }
  }
  cout << ans << '\n';
  return 0;
}
    ans += ans2;
  }
  cout << (ans % kMod + kMod) % kMod << '\n';
  return 0;
}

T2 交替

根据超大眼观察法,我们可以发现,当剩余数组大小为偶数的时候,呈现一个组合数的形式,于是使用公式 Cmn=m!n!(mn)! 配合逆元求出组合数来得出。

码量中等,花了25min才调出来。

#include <fstream>

using namespace std;
using ll = long long;

const ll kMaxN = 1e5 + 1, kMod = 1e9 + 7;

ifstream cin("alternate.in");
ofstream cout("alternate.out");

ll n, a[kMaxN], jie[kMaxN];

ll fpow(ll a, ll b) { // 快速幂
  ll res = 1;
  while (b) {
    (b & 1) && (res = res * a % kMod);
    b >>= 1;
    a = a * a % kMod;
  }
  return res;
}

ll C(ll m, ll n) { // 逆元求组合数
  return jie[m] * fpow(jie[m - n], kMod - 2) % kMod * fpow(jie[n], kMod - 2) % kMod;
}

int main() {
  jie[0] = 1;
  cin >> n;
  for (ll i = 1; i <= n; i++) {
    cin >> a[i], jie[i] = jie[i - 1] * i % kMod;
  }
  ll ans = 0;
  if (n & 1) { // 奇数的情况
    for (int i = 1; i <= n; i += 2) {
      ans = (ans + C(n / 2, i / 2) * fpow(-1, i / 2) * a[i] % kMod) % kMod;
    }
  } else { // 偶数的情况
    ll ans2 = 0;
    for (int i = 1; i < n; i += 2) {
      ans = (ans + C(n / 2 - 1, i / 2) * fpow(-1, i / 2) * a[i] % kMod) % kMod;
    }
    for (int i = 2; i <= n; i += 2) {
      ans2 = (ans2 + C(n / 2 - 1, i / 2 - 1) * fpow(-1, i / 2 - 1) * a[i] % kMod) % kMod;
    }
    ans += ans2;
  }
  cout << (ans % kMod + kMod) % kMod << '\n';
  return 0;
}

T3 拳击

赛事不会。

暴力出所有序列,然后跑DP, 码量比较大,暂时没写完。

T4 扑克

(经典永流传)

预先处理出每一个三元组添加两个牌的五元组,然后排序,最后用二分求得即可。

依旧是没有写完。

posted @   GenesisCrystal  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示