codeforces C. Devyatkino

题目简述:

给定一个整数n,可以给n加上仅由9组成的整数(9,99,999,9999......),问最少进行多少次可以使得n的任一数位上出现7?

思路:

观察规律,看看加上这个整数后对n的影响,可以发现对应数位上的数+上9会使得当前数位的值-1,可以根据这个特性求解;

这时我们可以发现次数最多不会超过9(对于6,-9次1就会变成7),次数很小,可以从小到大依次枚举次数

但考虑9很奇怪,不好想,我们可以换一种角度,把9看成10-1;对于n我们加几次就会-几次1,所以问题就变成了n-i加10,100等何时最少次数出现7(变成了可以对每一位+1,就很简单了);

现在我们可以进一步想到,次数最多不会超过7,因为对于n-i,最坏情况我们可以在最高位的前一位+高于n-i的数位的10的次幂,+7次便会符合条件

对于每一个n-i,我们枚举他的每一位数,对于符合条件的数直接输出即可,因为我们是从小到大枚举的;

总代码:

#include
using namespace std;
#define int long long
#define endl "\n"
const int N=5e5+10;
void solve(){
    int n;
    cin >> n;
    for (int i=0;i<7;i++) {
        string s=to_string(n-i);
        for (auto x:s) {
            int t=x-'0';
            if (t==7) {
                cout << i << endl;
                return ;
            }
            else if (t<7&&7-t==i) {
                cout << i << endl;
                return ;
            }
        }
    }
    cout << 7 << endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int q=1;
    cin>>q;
    while(q--) solve();
    return 0;
}

你可能感兴趣的:(枚举,结论,数学,c语言,算法)