1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <map>
 6 using namespace std;
 7 const int inf = 0x3f3f3f3f;
 8 const int MAX = 200+10;
 9 double GPA[10],dp1[20][30000],dp2[20][30000];
10 map<int,int> hash;
11 void init() {
12     memset(GPA,0,sizeof(GPA));
13     for(int i=60;i<=69;i++) hash[i]=1;
14     for(int i=70;i<=74;i++) hash[i]=2;
15     for(int i=75;i<=79;i++) hash[i]=3;
16     for(int i=80;i<=84;i++) hash[i]=4;
17     for(int i=85;i<=100;i++) hash[i]=5;
18     GPA[1]=2.0; GPA[2]=2.5; GPA[3]=3.0;
19     GPA[4]=3.5; GPA[5]=4.0;
20     memset(dp2,0,sizeof(dp2));
21     for(int i=0;i<=10;i++) {
22         for(int j=0;j<=1000;j++) dp1[i][j]=inf;
23     }
24     for(int i=60;i<=100;i++) {
25         dp1[1][i]=GPA[hash[i]];
26         dp2[1][i]=GPA[hash[i]];
27     }
28     for(int i=2;i<=10;i++) {
29         for(int v=0;v<=1000;v++) {
30             for(int j=60;j<=100;j++) {
31                 if(v>=j) {
32                     if(i==1) {
33                         dp1[i][v]=min(dp1[i][v],dp1[i-1][v-j]+GPA[hash[j]]);
34                         dp2[i][v]=max(dp2[i][v],dp2[i-1][v-j]+GPA[hash[j]]);
35                     }
36                     else if(((double)(v-j)/(double)(i-1))>=60) {
37                         dp1[i][v]=min(dp1[i][v],dp1[i-1][v-j]+GPA[hash[j]]);
38                         dp2[i][v]=max(dp2[i][v],dp2[i-1][v-j]+GPA[hash[j]]);
39                     }
40                 }
41             }
42         }
43     }
44 
45 
46 }
47 int main() {
48     int n,cnt,ave; init();
49     scanf("%d",&n);
50     while(n--) {
51         scanf("%d %d",&ave,&cnt);
52         int tot=ave*cnt;
53         printf("%.4lf %.4lf\n",dp1[cnt][tot]/(double)cnt,dp2[cnt][tot]/(double)cnt);
54     }
55     return 0;
56 }
View Code

相关文章: