《算法竞赛-训练指南》第一章-1.13_LA 3635

来源:互联网 发布:数据分析的道与术 ppt 编辑:程序博客网 时间:2024/05/28 15:10

这道题目好!非常好,虽然自己没有AC。但是,情有可原吧,当然没有AC就是没有AC,但是却是因为自己用了自己写的PI导致没有AC。这个不知道可不可以原谅呢?


题意是这样的,有N个pie,有F个朋友,让你把N个pie分成F +1让这些人都吃到一样的体积的pie,当然形状无所谓,但是你总不能这边一块,那边一块。加起来吧。


自己一想,这不也是求最大值么?果断二分答案啊。这不就一思考就想出来了。但是,就是判断所枚举的答案是不是符合条件的check函数的时候犹豫了很长时间,又是分情况考虑了,又是while循环了。但是自己认为还是能符合题意的解出来了的,但是错了,找了回错误还是不行。(谁会想到是PI的原因呢?)


然后想着,放着吧,看一下题解好了,一看,和我的方法一模一样,就是人家的check写的非常犀利。是好犀利,自己没有想到,我也不知道怎么说了。自己确实没有想到嘛。哭。。。

现在贴出自己的代码,注销的部分是题解的思想,(明显比我的简单):

#include <stdio.h>#include <string.h>#include <math.h>#include <iostream>#include <string>#include <algorithm>using namespace std;const int MAXN = 10011;const double PI = acos(-1.0);int pie[MAXN];double V[MAXN];double sum;int N, F;bool check(double key){double n = sum;for (int i = 0; i < N; i++){if (V[i] < key){n -= V[i];}else{ int cnt = 0;for (int j = i; j < N; j++){double temp = V[j];cnt += (int )floor(temp / key);}if (cnt >= (F + 1)){return true;}else{return false;}}if (n / (F + 1) < key){return false;}}}/*bool check(double key){int cnt = 0;for (int i = 0; i < N; i++){cnt += (int)floor(V[i] / key);}if (cnt >= (F + 1)){return true;}else{return false;}}*/int main(){int T;scanf("%d", &T);while (T--){scanf("%d%d", &N, &F);double MAX = -1.0;sum = 0;for (int i = 0; i < N; i++){scanf("%d", &pie[i]);V[i] = (double)pie[i] * pie[i] * PI;MAX = max(MAX, V[i]);sum += V[i];}sort(V, V + N); //用题解的话,这个排序就不需要了,但是好像也不是很影响速度,我和题解的时间是一样的. double left = 0;double right = MAX;while (right - left > 1e-5){double mid = (left + right) / 2;if (check(mid)){left = mid;}else{right = mid;}}printf("%.4lf\n", left);}//system("pause");return 0;}


原创粉丝点击