【差分 贪心】JZOJ

    xiaoxiao2023-10-25  167

    题意

    思路

    求出 a i a_i ai表示还需多少才能转换成 b i b_i bi,把它差分。 如果加的数不超过 4 4 4,那么答案就为 ∑ i = 1 n m a x ( 0 , a i ) \sum_{i=1}^{n}max(0,a_i) i=1nmax(0,ai)。 否则如果让区间 ( l , r ] (l,r] (l,r]加上4,即 a l − 4 , a r + 4 a_l-4,a_r+4 al4,ar+4,那么就要使 a r + 4 < a l a_r+4<a_l ar+4<al,分类讨论。

    代码

    #include<cstdio> int t, n, ans; int a[100002]; int main() { scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); int x; for (int i = 1; i <= n; i++) { scanf("%d", &x); a[i] = (x - a[i] + 4) % 4; } ans = 0; for (int i = 1; i <= n; i++) { a[i] -= a[i + 1]; if (a[i] > 0) ans += a[i]; } int t2 = 0, t3 = 0; for (int i = 1; i <= n; i++) { if (a[i] == -3) { if (t3) { t3--; ans -= 2; } else if (t2) { t2--; ans--; } } else if (a[i] == -2) { if (t3) { t3--; t2++; ans--; } } else { t2 += a[i] == 2; t3 += a[i] == 3; } } printf("%d\n", ans); } }
    最新回复(0)