
4 75 1 75 2 75 3 75 10
3.0000 3.0000 2.7500 3.0000 2.6667 3.1667 2.4000 3.2000HintIn the third case, there are many possible ways to calculate the minimum value of the GPA in the 4-Point Scale. For example, Scores 78 74 73 GPA = (3.0 + 2.5 + 2.5) / 3 = 2.6667 Scores 79 78 68 GPA = (3.0 + 3.0 + 2.0) / 3 = 2.6667 Scores 84 74 67 GPA = (3.5 + 2.5 + 2.0) / 3 = 2.6667 Scores 100 64 61 GPA = (4.0 + 2.0 + 2.0) / 3 = 2.6667
题意:告诉你n个人的平均数,求最大的,最小的平均绩点
思路:简单的DP,dp[i][j]前i个人总分j的最大绩点和
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 105;
const double inf = 90000000.0;
double dp[15][1010], tab[105];
double lp[15][1010];
int main() {
for (int i = 60; i <= 69; i++)
tab[i] = 2.0;
for (int i = 70; i <= 74; i++)
tab[i] = 2.5;
for (int i = 75; i <= 79; i++)
tab[i] = 3.0;
for (int i = 80; i <= 84; i++)
tab[i] = 3.5;
for (int i = 85; i <= 100; i++)
tab[i] = 4.0;
memset(dp, 0, sizeof(dp));
for (int i = 60; i <= 100; i++)
dp[1][i] = tab[i];
for (int i = 2; i <= 10; i++)
for (int j = 60; j <= 100; j++)
for (int k = j; k <= 1000; k++)
if (dp[i-1][k-j] != 0)
dp[i][k] = max(dp[i][k], dp[i-1][k-j]+tab[j]);
for (int i = 0; i <= 10; i++)
for (int j = 0; j <= 1000; j++)
lp[i][j] = inf;
for (int i = 60; i <= 100; i++)
lp[1][i] = tab[i];
for (int i = 2; i <= 10; i++)
for (int j = 60; j <= 100; j++)
for (int k = j; k <= 1000; k++)
if (lp[i-1][k-j] != inf)
lp[i][k] = min(lp[i][k], lp[i-1][k-j]+tab[j]);
int v, n;
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &v, &n);
printf("%.4lf %.4lf\n", lp[n][n*v]/n, dp[n][n*v]/n);
}
return 0;
}HDU 4968 Improving the GPA,布布扣,bubuko.com
原文:http://blog.csdn.net/u011345136/article/details/38689705