百度之星 Problem B
阿新 • • 發佈:2020-07-21
題面
小沃沃一共參加了 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; }