1. 程式人生 > 實用技巧 >百度之星 Problem B

百度之星 Problem B

題面

小沃沃一共參加了 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\n",dp[4][x]);
    }
    return 0;
}