传送门: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 ", 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; }