AtCoder Beginner Contest 467 C - Adjacent Sums (easy) 题解

前言

  • cccccD读假了没搞完
  • 初中白上了

solve

  • e,msjing \(DP\) 写假了,吃了 \(7\) 发罚时,hyw

  • \(DP\) 设计为第 \(i\) 个点翻转还是不翻转,给转移方程
    \(f_{i+1,0} = \begin{cases} f_{i,0} & ((a_i + a_{i+1}) \bmod 2 = 0)\\ f_{i,1} & ((a_i \oplus 1 + a_{i+1}) \bmod 2 = 0) \end{cases}\)
    \(f_{i+1,1} = \begin{cases} f_{i,0}+1 & ((a_i + a_{i+1} \oplus 1) \bmod 2 = 0)\\ f_{i,1} + 1 & ((a_i \oplus 1 + a_{i+1} \oplus 1) \bmod 2 = 0) \end{cases}\)

  • \(\LaTeX\) 太脱模难敲了,估计会出锅,e,转移以代码为准

  • msjing:555我下次一定认真敲

code

#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=2e5+10,inf=2e5+1;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || ch>'9')
    {
        if (ch == '-') f=-1;
        ch=getchar();
    }
    while (ch>='0' && ch<='9')
    {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n,m;
int a[maxn],b[maxn];
int f[maxn][2];
int main()
{
	n=read(),m=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<n;i++) b[i]=read();
	memset(f,0x3f,sizeof(f));
	f[0][0]=f[0][1]=0;
	for (int i=0;i<n;i++)
    {
        if ((a[i]+a[i+1])%2 == b[i]) f[i+1][0]=min(f[i+1][0],f[i][0]);
        if (((a[i]^1)+a[i+1])%2 == b[i]) f[i+1][0]=min(f[i+1][0],f[i][1]);
        if ((a[i]+(a[i+1]^1))%2 == b[i]) f[i+1][1]=min(f[i+1][1],f[i][0]+1);
        if (((a[i]^1)+(a[i+1]^1))%2 == b[i]) f[i+1][1]=min(f[i+1][1],f[i][1]+1);
//        cout << f[i][0] << " " << f[i][1] << endl;
    }
    printf("%d\n",min(f[n][0],f[n][1]));
	return 0;
}

后话

  • cnm \(DP\) 常常爆

批注 2026-07-18 220204

posted @ 2026-07-18 22:01  msjing  阅读(62)  评论(0)    收藏  举报