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);
	}
}
posted @ 2021-04-21 15:25  IdiotNe  阅读(40)  评论(0编辑  收藏  举报