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

浙公网安备 33010602011771号