题意:
给你数组a和数组b,你每次可以将a[i]与a[i+1]的值+1或者-1(1<=i<n),但是a[i]和a[i+1]不能超过9也不能小于0,问你能否做到,能的话输出每次的操作,到1e5为止。
题解:
注意他这个会爆int。
我们只需要贪心的从前往后去做,因为每个值一定是受到前面影响的。
将前面做完之后看a最后一个位置的值是否是和b是相等的即可。
之后只需要从前往后for一遍,对于不行的位置,我们dfs找出可行解即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pa pair<int,int>
const int N=1e5+5;
ll a[N],b[N],cnt;
vector<pa>ans;
void dfs(int x,int op)
{
if(op==1)
{
if(a[x+1]==9)
dfs(x+1,-1);
a[x]++,a[x+1]++;
if(cnt<=1e5)ans.push_back({x,1});
cnt++;
if(cnt>1e5)return ;
}
else
{
if(a[x+1]==0)
dfs(x+1,1);
a[x]--,a[x+1]--;
if(cnt<=1e5)ans.push_back({x,-1});
cnt++;
if(cnt>1e5)return ;
}
}
ll c[N];
int main()
{
int n;
cnt=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%1lld",&a[i]),c[i]=a[i];
for(int i=1;i<=n;i++)scanf("%1lld",&b[i]);
ll all=0;
for(int i=1;i<n;i++)
c[i+1]-=c[i]-b[i],all+=(ll)c[i]-b[i]>=0?c[i]-b[i]:b[i]-c[i];
if(c[n]!=b[n])
return 0*printf("-1\n");
for(int i=1;i<n;i++)
{
if(cnt>1e5)
break;
while(a[i]>b[i])
{
if(a[i+1]==0)dfs(i+1,1);
a[i]--,a[i+1]--;
if(cnt<=1e5)ans.push_back({i,-1});
cnt++;
if(cnt>1e5)
break;
}
while(a[i]<b[i])
{
if(a[i+1]==9)dfs(i+1,-1);
a[i]++,a[i+1]++;
if(cnt<=1e5)ans.push_back({i,1});
cnt++;
if(cnt>1e5)
break;
}
}
printf("%lld\n",all);
for(auto i:ans)printf("%d %d\n",i.first,i.second);
return 0;
}