CF edu 42 C. Make a Square

传送门:https://codeforces.com/problemset/problem/962/C

题意:给定数n(1~2e9),可任意删某位上的数字,尽量使剩下的数开方后为整数,输出最少可删多少位数。

随便搞一搞,先把1~1e5所有数的平方存下来,

接下来就是怎么筛数了

咋筛呢  n最多9位 从1位开始一直删到9位  哇 麻烦死,9个循环第9个循环内还有8个循环 

那换个角度 n不行 就试试所有平方数,反正才1e5个,

每个试一下 把n转化为字符串,看在n中能不能找到这1e5个数  ,n最多9位  咦 复杂度还行耶  过得去

上手搞搞

完成   A了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> p;
typedef long double ld;
#define mem(x) memset(x, 0, sizeof(x))
#define me(x) memset(x, -1, sizeof(x))
#define fo(i,n) for(i=0; i<n; i++)
#define sc(x) scanf("%lld", &x)
#define pr(x) printf("%lld\n", x)
#define pri(x) printf("%lld ", x)
#define lowbit(x) x&-x
const ll MOD = 1e18 +7;
const ll N = 6e6 +5;
ll a[N];
string s[N];
ll f(string s, string t)
{
    if(s.size()>t.size()) return -1;
    ll j=0;
    for(ll i=0; i<s.size(); i++)
    {
        ll f=0;
        for(; j<t.size(); j++)
        {
            if(t[j]==s[i])
            {
                j++;
                f=1;
                break;
            }
        }
        if(!f) return -1;
    }
    return t.size()-s.size();
}
int main()
{
    ll i, j ,k, l=0;
    ll n, m, t;
    string h="fff", p="sdsf";
    f(h,p);
    for(i=1; i<=100000; i++)
    {
        k=i*i;
        string ss;
        while(k)
        {
            ss+=(k%10)+'0';
            k/=10;
        }
        reverse(ss.begin(), ss.end());
        s[i]=ss;
    }
    string s1;
    cin>>s1;
    n=s1.size();
    for(i=100000; i>=1; i--)
    {
        k=f(s[i],s1);
        if(k>=0)
        {
            cout<<k<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}
View Code

 

posted @ 2019-05-07 15:13  op-z  阅读(225)  评论(0编辑  收藏  举报