题解: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;
}