SJTU SCPC Monthly Oct.2013 Problem B. mincut
尼玛中学知识都望的差不多了连复合函数都不记得了!
【题目描述】
最大流最小割定理是一个非常美妙的定理,不过我们暂时抛开它的定义。
我们的战士正在和敌人交战! 是时候启动“min cut”行动了!
如我们所知,我们的战士拥有一个士气值,它随着时间的变化,其精确值为a * (t - b) * (t - c) + d * (t - e) + f。当发动min cut的时候,所有的战士的士气值会变成瞬间变成1000000007。所以,指挥官想知道,我们应该在什么时候发动min cut,能使得士气值之和提升得最多。注意,你只需要关心这一瞬间值的提升。
另外,因为某些特殊原因,发动的时刻不应该超过1200。
【输入格式】
输入入的第一行包含一个整数T,表示数据的组数。 接下来每组数据的第一行包括一个正整数n,表示战士的个数。之后的n行每行包括六个整数a, b, c,d,e,f,表示题目中描述的系数。
【输出格式】
输出T行,每行包括一个实数,四舍五入到4位小数,表示我们应该发动行动的时间。如果有多个提升最高的时刻,请输出最早的一个。
【样例输入】
2
1
0 0 0 0 0 1
2
2 0 2 0 0 2
1 0 1 0 0 2
【样例输出】
0.0000
0.8333
【数据范围】
n不超过200。
a, b, c,d,e,f均为整数(其中a是非负整数),并且绝对值值不超过100。
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include <map> 3 #include <queue> 4 #include <vector> 5 #include <string> 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <algorithm> 10 using namespace std; 11 #define maxn 105 12 #define mod 1000000007 13 #define ll long long 14 #define INF 0x7fffffff 15 ll f[maxn][maxn]; 16 int n, m; 17 int main(){ 18 int cas = 1; 19 int t; 20 scanf("%d", &t); 21 while (t--){ 22 scanf("%d", &n); 23 int a, b, c, d, e, f; 24 double time = 0; 25 double mi = INF; 26 double x=0.0, y=0.0, z=0.0; 27 for (int i = 0; i < n; i++){ 28 scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f); 29 x += a; 30 y += d - a*b - a*c; 31 z += a*b*c - d*e + f; 32 } 33 time = -y / x / 2.0; 34 if (time >= 0 && time <= 1200&&x) 35 mi = x*time*time+y*time+z; 36 double xx = z; 37 if (mi >= xx){ mi = xx; time = 0; } 38 xx=x * 1200 * 1200 - y * 1200 + z; 39 if (mi > xx){ mi = xx; time = 1200; } 40 printf("%.4lf\n", time); 41 } 42 return 0; 43 }
浙公网安备 33010602011771号