UVA11342 Three-square 题解
Zskioaert1106 · · 题解
题目传送门:UVA11342 Three-square
题目大意:有 -1。
做题过程
首先我非常一眼的写了暴力:
#include<iostream>
using namespace std;
void blss(int n){
for(int a=0;a*a<=n;a++){
for(int b=0;b*b<=n-a*a;b++){
for(int c=0;c*c<=n-a*a-b*b;c++){
if(a*a+b*b+c*c==n){
cout<<a<<' '<<b<<' '<<c;
return;
}
}//这里两处的枚举只要分别到(n-a^2)和(n-a^2-b^2)即可
}
}
cout<<-1;//若枚举完都没有满足的情况,按要求输出-1
return;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
blss(n);
cout<<'\n';
}
return 0;
}
这样是朴素的三重循环。然后,T 飞了。
我们想想看,在前两层循环的前提下,每次遍历时第三层循环的
-
可以达成性质:输出
a,b,c 并结束函数 -
不可以:进行下一次遍历
而这里只要判断所谓的
于是我们写下了如下代码:
#include<iostream>
#include<cmath>
using namespace std;
void blss(int n){
for(int a=0;a*a<=n;a++){
for(int b=0;a*a+b*b<=n;b++){
int c=sqrt(n-a*a-b*b);
if(c*c==n-a*a-b*b){
cout<<a<<' '<<b<<' '<<c;
return;
}
}
}
cout<<-1;
return;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
blss(n);
cout<<'\n';
}
return 0;
}
然后,就过了。。