zoukankan      html  css  js  c++  java
  • Once in a casino CodeForces

    大意: 给定两个字符串$a,b$, 每个字符为$0-9$, 每次操作将$a$中相邻两位加$1$或减$1$, 操作后每个数仍要为$0-9$, 求最少操作使$a$变成$b$.

    先不考虑范围, 判断是否成立. 然后暴力输出方案即可

    #include <iostream>
    #include <cstdio>
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    using namespace std;
    typedef long long ll;
    
    const int N = 1e6+10;
    int n;
    char s[N], t[N];
    ll ans, a[N];
    
    void dfs(int x, int w) {
    	if (s[x+1]+w<'0'||s[x+1]+w>'9') dfs(x+1,-w);
    	printf("%d %d
    ",x,w);
    	s[x] += w;
    	s[x+1] += w;
    	if (!--ans) exit(0);
    }
    
    int main() {
    	scanf("%d%s%s", &n, s+1, t+1);
    	REP(i,1,n) { 
    		a[i] = -a[i-1]+t[i]-s[i];
    		ans += abs(a[i]);
    	}
    	if (a[n]) return puts("-1"),0;
    	printf("%lld
    ", ans);
    	if (!ans) return 0;
    	ans = min(ans, (ll)1e5);
    	REP(i,1,n-1) {
    		while (s[i]!=t[i]) dfs(i,t[i]>s[i]?1:-1);
    	}
    }
    
  • 相关阅读:
    APIO2018 题解
    【THUWC2017】在美妙的数学王国中畅游(bzoj5020)
    【bzoj3270】博物馆
    【库存】NOI笔试习题集
    装饰器
    异常
    类的详解
    函数
    流程控制
    运算符
  • 原文地址:https://www.cnblogs.com/uid001/p/11198231.html
Copyright © 2011-2022 走看看