【POJ - 1862】Stripies (贪心)
【POJ – 1862】Stripies (贪心)
Stripies
直接上中文了
Descriptions
Input
Output
Sample Input
3 72 30 50
Sample Output
120.000
Hint
样例解释: 72与50合并,产生120,120与30合并,产生120
题目链接
https://vjudge.net/problem/POJ-1862
贪心算法,2*sqrt(m1*m2) 有这个式子易得m1和m2应该每次都是这个数组里最大的两个数,想到这就简单了,每次排个序就行了
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 100000+100 using namespace std; int n; double m[Maxn]; bool cmp(double x,double y)//m数组按从大到小排序 { return x>y; } double fun(double m1,double m2)//题目要求的函数 { return 2*sqrt(m1*m2); } int main() { cin>>n; for(int i=0;i<n;i++) cin>>m[i]; sort(m,m+n,cmp);//排序 while(m[1]!=0) { m[0]=fun(m[0],m[1]);//更新 m[1]=0; sort(m,m+n,cmp); // 不懂的看一加上下面的注释看一下里面的操作 // for(int i=0;i<n;i++) // cout<<m[i]<<" "; // cout<<endl; } printf("%.3f\n",m[0]); return 0; }