来补解题报告。

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 }
View Code

相关文章: