来补解题报告。
Problem A: 【C语言训练】求具有abcd=(ab+cd)^2性质的四位数
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 37 Solved: 37
[Submit][Status][Web Board]
Description
3025这个数具有一种独特的性质:将它平分为二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身。请求出具有这样性质的全部四位数
Input
Output
满足题意的数全部四位数(从小到大输出,且数之间用两个空格分开)
Sample Input
Sample Output
2025 3025 9801
HINT
根据题意可以采用穷举法,对所有四位数进行判断,从而筛选出符合这种性质的四位数。具体算法实现,可任取一个四位数,将其截为两部分,前两位为a,后两位为b,然后套用公式计算并判断。
[Submit][Status][Web Board]
不写了,答案就是样例上面的了。
Problem B: VIJOS-P1237
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 101 Solved: 12
[Submit][Status][Web Board]
Description
天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美。 现在天使给了小杉N只翅膀,小杉想挑出一对最完美的。
Input
每组测试数据的 第一行有一个数N(2< =N< =30000) 第二行有N个不超过1e5的正整数,表示N只翅膀的长度。 20%的数据N< =100
Output
对每组测试数据输出两个整数,表示小杉挑选出来的一对翅膀。 注意,比较短的在前,如果有多对翅膀的完美程度一样,请输出最小的一对。
Sample Input
4
2 3 4 6
Sample Output
2
3
HINT
你可以认为黄金分割比就是0.6180339887498949
题目大意:不用多说,给你n个数,要求挑出两个数使得两者之比最接近黄金分割。
分析:首先当然要按大小先排个序,然后维护一个最接近黄金比例的结果就可以了,采用类似于二分的思想。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define st 0.6180339887498949 7 #define maxlen 30010 8 using namespace std; 9 int num[maxlen]; 10 double myabs(double x) 11 { 12 return x<0?-x:x; 13 } 14 int main() 15 { 16 int n; 17 while(scanf("%d",&n)!=EOF) 18 { 19 int s=1,e=2; 20 double minc=1000; 21 int mina,minb; 22 for (int i=1; i<=n; i++) 23 scanf("%d",&num[i]); 24 sort(num,num+n); 25 while(e<=n) 26 { 27 if (myabs(num[s]*1.0/num[e]-st)<minc) 28 { 29 mina=num[s]; 30 minb=num[e]; 31 minc=myabs(num[s]*1.0/num[e]-st); 32 } 33 if (myabs(num[s]*1.0/num[e])<st) 34 s++; 35 else 36 e++; 37 } 38 printf("%d\n%d\n",mina,minb); 39 } 40 return 0; 41 }