AT2290 【[AGC009A] Multiple Array】

洛谷终于能测AT了,点个赞。

话不多说,我们进入正题

本题主要测试选手的逆序思维

【part 1】题意简述

按下第i个按钮,a[1...i]全+1,求按多少个键试每个数为指定数的倍数

【part 2】算法&思路分析

十年OI一场空,不开longlong见祖宗。(haha)

请注意数据范围哦 作者为此调试一小时

因为按后面的按钮会影响前面的按钮,所以……

循环要倒着写

这其实就是本题重点了。剩下的咱模拟就行。

注意,求与b[i]倍数最小的差用( ( ( a[i] ) / b[i] ) + 1 ) * b[i] - a[i]

记得加上后面加的哟(^U^)ノ~YO

【part 3】代码分析

#include <iostream>
#include <cstdio>

using namespace std;

long long n , a[100005] , b[100005] , ans , num ; 

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    cin >> n ;
    for ( int i = 1 ; i <= n ; i ++ ) {
        cin >> a[i] >> b[i] ;
    }
    for ( int i = n ; i > 0 ; i -- ) {
        if ((a[i]+num)%b[i]) {//记住加num!
            long long sum = ( ( ( a[i] + num ) / b[i] ) + 1 ) * b[i] - a[i] - num ;//记住加减num!
            ans += sum , num += sum ;
        }
    }
    cout << ans ;
    return 0;
                                                                             防抄袭
}
posted @ 2020-11-05 22:07  泠詟  阅读(85)  评论(1)    收藏  举报