P3078 [USACO13MAR] Poker Hands S 题解

看到题解区,我有点震惊,什么贪心、线段树、各种优化都有,在此%%%。但其实这道题一个小小的差分就可解决。

前置芝士:前缀和/差分 by OI Wiki


题意简述

在一个 $card$ 数组中有 $n$ 个数,可以每次选择一个区间 $[i,j]$,使 $card[i,i+1,......,j-1,j]$ 这些数 $-1$。求至少需要几次操作才可以把数组内的数都变成 $0$。

解题过程

首先考虑递归,然后发现,TLE 了两个点,$80$ 分,认定为错解。

再考虑如何优化,然后发现这题竟然有差分解法,那么,直接和我一起切掉它!

#include<bits/stdc++.h>//熟悉的万能头
using namespace std;
int cf[100009],card[100009];
int main(){
    //输入
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>card[i];
    }
    //求差分数组
    for(int i=1;i<=n;i++){
        cf[i]=card[i]-card[i-1];
    }
    //求前缀和并输出
    long long ans=0;
    for(int i=1;i<=n;i++){
        if(cf[i]>0)ans+=cf[i];
    }
    cout<<ans;
}
/*-------------------代码数据---------------------*/

分数:100

编程语言:C++20 O2

代码长度:343B

用时:108ms

内存:1.216MB

完结撒花!

posted @ 2024-02-06 15:06  StarsTwinkle  阅读(59)  评论(0)    收藏  举报  来源