平方数
时间: 1ms 内存:128M
描述:
您将获得一个正整数n,写入时不带前导零(例如,数字04不正确)。
在一个操作中,您可以删除给定整数的任何数字,以便结果保持正整数而不带前导零。
用最少的操作找到一个平方数(4,9,16,,,,,,) 如果找不到输出 -1
例如 : 8314 最少的操作是删除3和4,得到81 ,需要两次操作。
输入:
第一行包含一个整数n(1 ≤ n ≤ 2 ⋅ 10^9)。给出的数字没有前导零。
输出:
输出执行此操作所需的最少操作数。如果无法从n得到一个平方数,则输出-1。
示例输入:
8314
示例输出:
2
提示:
参考答案(内存最优[1132]):
#include<stdio.h>
#include<math.h>
int num[11],book[11],pre0[11];
int tot=0,mintot=1000;
int getnum(int lenth)
{
int res=0;
for(int i=lenth;i>=1;i--){
if(!book[i]&&!pre0[i]){
res*=10;
res+=num[i];
}
}
return res;
}
void solve(int lenth,int dep)
{
if(dep==lenth+1){
for(int i=lenth;i>=1;i--){
if(!book[i]&&num[i])break;
if(!book[i]&&!num[i]){
pre0[i]=1;
tot++;
}
}
for(int i=lenth;i>=1;i--){
if(book[i])tot++;
}
if(tot==lenth)return;
double x=sqrt(getnum(lenth));
for(int i=lenth;i>=1;i--)pre0[i]=0;
if(x==(int)x){
if(tot<mintot)mintot=tot;
}
tot=0;
return;
}
book[dep]=1;
solve(lenth,dep+1);
book[dep]=0;
solve(lenth,dep+1);
}
int main()
{
//freopen("in.txt","r",stdin);
int cnt=0,m=0;
scanf("%d",&m);
while(m){
num[++cnt]=m%10;
m/=10;
}
solve(cnt,1);
if(mintot<1000)printf("%d\n",mintot);
else printf("-1\n");
return 0;
}
参考答案(时间最优[2]):
#include <bits/stdc++.h>
#define IO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 10;
char a[maxn];
bool judge(int x) {
int sq = sqrt(x) + .5;
return sq * sq == x;
}
void solve(int n) {
int ans = INT_MAX;
for (int i = 1; i < 1 << n; i++) {
LL num = 0;
int cnt = 0, idx = -1;
for (int j = n - 1; j >= 0; j--) {
if ((1 << j) & i) {
num = num * 10;
num += a[j] - '0';
++cnt;
if (idx == -1)
idx = j;
}
}
if (a[idx] == '0' && cnt > 1) {
continue;
}
if (num > 0 && judge(num)) {
// cout << num << " " << cnt << " " << i << endl;
ans = min(ans, n - cnt);
}
}
cout << (ans == INT_MAX ? -1 : ans) << endl;
}
int main() {
#ifdef LOCAL_IM0QIANQIAN
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#else
IO;
#endif // LOCAL_IM0QIANQIAN
cin >> a;
int len = strlen(a);
reverse(a, a + len);
solve(len);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。