题面
小沃沃一共参加了 4 门考试,每门考试满分 100 分,最低 0 分,分数是整数。
给定四门考试的总分,请问在最优情况下,四门课绩点的和最高是多少?
分数与绩点之间的对应关系如下:
95~100 4.3
90~94 4.0
85~89 3.7
80~84 3.3
75~79 3.0
70~74 2.7
67~69 2.3
65~66 2.0
62~64 1.7
60~61 1.0
0~59 0
Input
第一行一个正整数 test(1≤test≤401) 表示数据组数。
接下来 test 行,每行一个正整数 x 表示四门考试的总分 (0≤x≤400)。
Output
对于每组数据,一行一个数表示答案。答案保留一位小数。
Sample Input
2
0
400
Sample Output
0.0
17.2
思路
直接暴力就可以了,可以dfs和可以写个简单dp枚举状态。
代码实现
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring >
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=20;
double point [105];
double dp[4][405];
int main () {
memset (dp,0,sizeof (dp) );
for (int i=0;i<=100;i++) {
if (i>=95&&i<=100) point [i]=4.3;
else if (i>=90&&i<=94) point[i]=4.0;
else if (i>=85&&i<=89) point[i]=3.7;
else if (i>=80&&i<=84) point[i]=3.3;
else if (i>=75&&i<=79) point[i]=3.0;
else if (i>=70&&i<=74) point[i]=2.7;
else if (i>=67&&i<=69) point[i]=2.3;
else if (i>=65&&i<=66) point[i]=2.0;
else if (i>=62&&i<=64) point[i]=1.7;
else if (i>=60&&i<=61) point[i]=1.0;
else point[i]=0.0;
}
for (int i=1;i<=4;i++)
for (int j=0;j<=100*i;j++)
for (int k=0;k<=min (100,j);k++) {
dp[i][j]=max (dp[i][j],dp[i-1][j-k]+point[k]);
}
int t,x;
cin>>t;
while (t--) {
cin>>x;
printf ("%.1lf
",dp[4][x]);
}
return 0;
}