周赛38——小红的平滑值插值

小红的平滑值插值

https://ac.nowcoder.com/acm/contest/78292/D

观察易知,我们存在相邻元素差的绝对值大于k,就需要在中间插入元素,插入元素的个数ans = abs(差值)/K,当差值整除k时间,ans需要减一。 我们还需要考虑几个特殊情况: (1)最大差值小于k,输出1即可,我们使用flag标记。 (2)最大差值等于k,输出0。

注意:一定要开long long(我绝对没有忘开)

typedef long long ll;
using namespace std;
const int N = 2e5 + 10;
const int mod  = 1e9 + 7;
//不开long long见祖宗
void solve(){
    ll n,k;
    cin>>n>>k;
    vector<ll> a(n+1,0);
    for (int i = 1; i <= n; ++i) {
        cin>>a[i];
    }
    ll ans = 0;
    bool flag = false;
    ll maxx = 0;
    for (int i = 2; i <= n; ++i) {
        ll tmp = abs(a[i] - a[i-1]);
        maxx = max(maxx,tmp);
        if(tmp >= k){
            flag = true;
            ans += tmp/k;
            if(tmp%k == 0) ans--;
        }
    }
    if(maxx ==  k){
        cout<<"0"<<endl;
        return;
    }
    if(!flag){
        cout<<1<<endl;
        return;
    }
    cout<<ans<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0 ;
}
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务