POJ 1018
做题时候陷入一个误区,就是担心出错不敢想,不敢写,这道题入手思路是对的,但是畏首畏尾,自己规定时间写不出来,大略览了他人题解发现自己思路是对的才敢开始着手写,学会分析和对自己有自信是练习的一个很重要的指标兼目标
题目就是利用DP搜索,不过这道题没给出贷款,费用值的范围是一个很不应该的地方,因为这涉及变量存储以及算法时间估计
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int maxp= 1111;
const int maxn= 105;
const int INF= 0x3f3f3f3f;
int dv[maxn][maxp];
int dev_b[maxn][maxn], dev_p[maxn][maxn];
int mi[maxn];
int main()
{
int kase, n;
scanf("%d", &kase);
while (kase--){
int mx= -1, mn= INF;
scanf("%d", &n);
memset(dv, 0x3f, sizeof(dv));
for (int i= 0; i< n; ++i){
scanf("%d", mi+i);
for (int j= 0; j< mi[i]; ++j){
scanf("%d %d", dev_b[i]+j, dev_p[i]+j);
mx= max(mx, dev_b[i][j]);
mn= min(mn, dev_b[i][j]);
}
}
for (int i= 0; i< mi[0]; ++i){
dv[0][dev_b[0][i]]= dev_p[0][i];
}
for (int i= 1; i< n; ++i){
for (int j= 0; j< mi[i]; ++j){
int b= dev_b[i][j], p= dev_p[i][j];
for (int k= mn; k< b; ++k){
if (dv[i-1][k]>= INF){
continue;
}
dv[i][k]= min(dv[i][k], dv[i-1][k]+p);
}
for (int k= b; k<= mx; ++k){
if (dv[i-1][k]>= INF){
continue;
}
dv[i][b]= min(dv[i][b], dv[i-1][k]+p);
}
}
}
double ans= -1;
for (int i= mn; i<= mx; ++i){
if (dv[n-1][i]>= INF){
continue;
}
ans= max(ans, ((double)i)/dv[n-1][i]);
}
printf("%.3lf\n", ans);
}
}