Codeforces 962C 解题报告

题意:

给定一个数,让你删除其中的若干个数位,使其成为完全平方数,当然也可以不删除,若无论如何删除也无法满足题意,输出-1,求满足题意需要删除的最少数位个数。

思路:

大体思路就是,暴力枚举,我是直接把给定的数转成字符串

scanf("%d", &n);

itoa(n, sn, 10);

以上两步代码,就是转整型为字符串的,itoa( )函数与atoi( )函数互逆。转换完时候,暴力枚举 n 以内的完全平方数,再将枚举到的完全平方数转化为字符串,同样用到itoa( )函数,再按位比较,用一个min维护即可。定两个位置p1, p2, 分别是整数 n 和 i ^ 2 的起始位置,<i> 然后p1一直执行++,扫到整数n的末位,<ii>如果碰到与i ^ 2第一个数位相等的,就执行p2++,扫i ^ 2接下来的数位。注意这两步的顺序。

本人AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int Inf = 1e9 + 7;
int n, ans;
char sn[12], si[12];

int main() {
    scanf("%d", &n);
    itoa(n, sn, 10);
    ans = Inf;
    int ln = strlen(sn);
    for(int i = 1; i * i <= n; i++) {
        itoa(i * i, si, 10);
        int li = strlen(si);
        int p1 = 0, p2 = 0; //p1对应n数位位置, p2对应 i^2 数位位置
        while(p1 < ln) {
            if(p1 < ln && p2 < li && sn[p1] == si[p2]) p2++;
            p1++;
        }
        if(p2 == li) ans = min(ans, ln - li);
    }
    if(ans == Inf) puts("-1");
    else printf("%d\n", ans);
}

猜你喜欢

转载自blog.csdn.net/EricGipsy/article/details/80037899