POJ-1018

来源:互联网 发布:c语言中数据类型范围 编辑:程序博客网 时间:2024/05/14 15:59

POJ-1018

网上有人说这道题的每个mi均不超过1009,因此就比较简单了,dp也好暴力也好贪心也好。不过我写这个dp时候总觉得要T了=_=

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <cctype>#include <climits>#include <ctime>#include <iostream>#include <algorithm>#include <map>#include <set>#include <bitset>#include <deque>#include <vector>#include <queue>#include <utility>#include <stack>#include <functional>using namespace std;typedef long long lovelive;const int inf = INT_MAX;const double pai = acos(-1.0);const double gold = (sqrt(5.0) - 1.0) / 2.0;double base_arr[117][117][2], dp[117][1117];int listc[117];int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE//    freopen("in.in", "r", stdin);//    freopen("out.out", "w", stdout);#endif // ONLINE_JUDGE    int i, j, k;    int t, n, mi;    while(scanf("%d", &t) != EOF)    {        while(t--)        {            memset(listc, 0, sizeof(listc));            memset(base_arr, 0, sizeof(base_arr));            scanf("%d", &n);            for(i = 1; i <= n; ++i)            {                for(j = 1; j <= 1110; ++j)                {                    dp[i][j] = inf;                }            }            for(i = 1; i <= n; ++i)            {                scanf("%d", &mi);                listc[i] = mi;                for(j = 1; j <= mi; ++j)                {                    scanf("%lf %lf", &base_arr[i][j][0], &base_arr[i][j][1]);                    if(i == 1)                    {                        for(k = 1; k <= base_arr[i][j][0]; ++k)                        {                            dp[1][k] = min(base_arr[i][j][1], dp[1][k]);                        }                    }                }            }            for(i = 2; i <= n; ++i)            {                for(j = 1; j <= listc[i]; ++j)                {                    for(k = 1; k <= base_arr[i][j][0];++k)                    {                        dp[i][k] = min(dp[i - 1][k] + base_arr[i][j][1], dp[i][k]);                    }                }            }            double maxc = 0.0;            for(i = 1; i <= n; ++i)            {                for(j = 1; j <= listc[i]; ++j)                {                    if(base_arr[i][j][0] / dp[n][(int)(base_arr[i][j][0])] >= maxc)                    {                        maxc = base_arr[i][j][0] / dp[n][(int)(base_arr[i][j][0])];                    }                }            }            printf("%.3lf\n", maxc);        }    }return 0;}
0 0
原创粉丝点击