POJ1862-Stripies
天降正义!!!
【题目描述】
两条变形虫可以进行合并,合并后新的个体质量为2*sqrt(m1*m2),m1、m2是原来未合并前两条变形虫的质量。已知3条或3条以上变形虫无法进行合并。
现在请你编程解决,当 N条变形虫进行两两合并,最后成为一条变形虫时,最小的质量为多少。
【输入】
第一行输入一个整数N(1<=N<=100),表示变形虫的数量。接下来N行每行包括一个1到10000之间的正整数,表示每条变形虫的重量。
【输出】
输出一个整数,表示最小可能生成的变形虫重量,精确到小数点后第三位。
【输入示例】
3
72
30
30
【输出示例】
120.000
好吧,令人失望的是,这道题是个贪心(不是深搜QWQ)。
我们稍微计算一下,可以发现m*n>=2*sqrt(m*n)。
所以,每次只要把最大的两个数进行计算就可以了。
但是,这道题最坑的地方反而在于输出格式。
首先,我用的是这种:
1 printf("%7.3f",bug[0]);
成功的输出格式错误。(fuck)
然后,我又改成这种:
1 cout <<setprecision(3) <<std::fixed<<x <<endl;
没加头文件,编译错误。(无fuck说)
最后,我改成这种:
1 printf("%.3lf\n",bug[0]);
终于对了!!!(哭出声来)
好的不扯淡了,以下代码:
1 #include<iostream>
2 #include<cmath>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 int n;
7 double bug[113];
8 void px()
9 {
10 for(int i=0;i<n;i++)
11 {
12 for(int j=i+1;j<n;j++)
13 {
14 if(bug[i]<bug[j])
15 {
16 swap(bug[i],bug[j]);
17 }
18 }
19 }
20 }
21 int main()
22 {
23 cin>>n;
24 for(int i=0;i<n;i++)
25 {
26 cin>>bug[i];
27 }
28 int k=n;
29 while(k>1)
30 {
31 px();
32 double a=2*sqrt(bug[0]*bug[1]);
33 bug[1]=0;
34 bug[0]=a;
35 k--;
36 }
37 printf("%.3lf\n",bug[0]);
38 }
总之,一道输出贼坑贼坑的贪心就这么出来了。老娘要给作者寄刀片!
在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。