Codeforces 1120 B Once in a casino —— 暴力

This way

题意:

给你数组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;
}

发布了530 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/101628676