题解:P11393 [JOI Open 2019] 汇款 / Remittance

· · 题解

注意到我们想要一间房子里的钱数达到目标钱数,必须要让它往它后面的房子里汇款,直到里面的钱数小于等于目标钱数(可以刚好等于或者刚好少一元)。再汇款一圈之后,只有第一间房子里面可能会有很多钱,其他房子里的钱数都小于等于目标钱数。然后我们再多汇款几圈,比如说再转五十圈。最后看所有的房子里面的钱数是否都达到了目标钱数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,a[N],b[N],t=50;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
    }
    while(t--)
    {
        for(int i=1;i<=n;i++)
        {
            if(a[i]>b[i])
            {
                int xin=b[i]-(a[i]-b[i])%2;
                if(xin<0)
                {
                    xin=b[i]+(a[i]-b[i])%2;
                }
                a[i%n+1]+=(a[i]-xin)/2;
                a[i]=xin;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=b[i])
        {
            cout<<"No";
            return 0;
        }
    }
    cout<<"Yes";
    return 0;
}