题目链接
题目链接(可提交)
题意:
四门课考试,每课最高100分,最低0分,给定特定gpa换算算法
已知最终百分制总分,求最高gpa绩点,保留一位小数,多组数据(4e2)
思路:
最暴力的做法当然是暴力枚举四门课的所有可能百分制分数分配方案,貌似复杂度完全ok
这里稍稍改进一下,选取3+1枚举方式,暴力枚举前三科,利用最后一课进行查询
当然最优方案应为2+2枚举方式,思路与3+1枚举相同,这里以3+1枚举为例
代码:
/*
Author Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 500;
double gpa3[maxn];
double gpa4[maxn];
double change[101];
int main()
{
memset(gpa3,0,sizeof gpa3);
memset(gpa4,0,sizeof gpa4);
for(int i=0;i<=59;i++) change[i] = 0;
for(int i=60;i<=61;i++) change[i] = 1.0;
for(int i=62;i<=64;i++) change[i] = 1.7;
for(int i=65;i<=66;i++) change[i] = 2.0;
for(int i=67;i<=69;i++) change[i] = 2.3;
for(int i=70;i<=74;i++) change[i] = 2.7;
for(int i=75;i<=79;i++) change[i] = 3.0;
for(int i=80;i<=84;i++) change[i] = 3.3;
for(int i=85;i<=89;i++) change[i] = 3.7;
for(int i=90;i<=94;i++) change[i] = 4.0;
for(int i=95;i<=100;i++) change[i] = 4.3;
for(int i=0;i<=100;i++)
for(int j=i;j<=100;j++)
for(int k=j;k<=100;k++)
gpa3[i+j+k] = max(gpa3[i+j+k],change[i]+change[j]+change[k]);
for(int i=60;i<=100;i++)
for(int j=i;j<=400;j++)
gpa4[j] = max(gpa4[j],gpa3[j-i]+change[i]);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%.1lf\n",gpa4[n]);
}
return 0;
}