zoukankan      html  css  js  c++  java
  • POJ 1018 Communication System

    WA 的分析

    1. solve_dp 返回的是 double 不是 int 浪费了非常久的时间

    2. 做动规, 当状态转移方程比较复杂时, 举例子能够帮助初始化和写出状态转移方程

    总结

    1. 这里 dp 的设置是 tight, 一般 tight 都是比较难的题目

    #include <iostream>
    #include <stdio.h>
    #include <memory.h>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <deque>
    #include <cstring>
    #define MIN(x,y) (x)<(y)?(x):(y)
    #define MAX(x,y) (x)>(y)?(x):(y)
    using namespace std;
    
    vector<int> money[200];
    vector<int> bandWidth[200];
    
    int dp[200][200];
    
    // tight, not exactly 
    // handle to decide the iterator function
    // use examples to help understand
    double solve_dp(int n, int maxbw)  {
    	memset(dp, 0x3f, sizeof(dp));
    	
    	// init
    	dp[0][0] = 0;
    	for(int i = 0; i < money[0].size(); i ++)  {
    		for(int j = 1; j <= bandWidth[0][i]; j ++)  {
    			dp[0][j] = min(dp[0][j], money[0][i]);
    		}
    	}
    
    	// main procedure
    	for(int i = 1; i < n; i ++)  {
    		for(int  j = 0; j <= maxbw; j ++)  {
    			bool init = false;
    			for(int k = 0; k < money[i].size(); k ++)  {
    				if(j > bandWidth[i][k]) continue;
    				if(init)  {
    					dp[i][j] = dp[i-1][j] + money[i][k];
    					init = true;
    				}  else  {
    					dp[i][j] = min(dp[i][j], dp[i-1][j] + money[i][k]);
    				}
    					
    			}
    		}
    	}
    
    	double res = 0.0;
    	for(int i = 1; i <= maxbw; i ++)  {
    		if(dp[n-1][i] == 0x3f3f3f3f) continue;
    		res = MAX(res, i*1.0/dp[n-1][i]);
    	}
    
    	return res;
    }
    
    int main() {
    	freopen("C:\Users\vincent\Dropbox\workplacce\joj\test.txt", "r", stdin);
    	
    	int T, N;
    	scanf("%d", &T);
    	while(T--)  {
    		scanf("%d", &N);
    
    		int maxbw = 0;
    		for(int i = 0; i < N; i ++)  {
    			int number;
    			scanf("%d", &number);
    			money[i].clear();
    			bandWidth[i].clear();
    			for(int j = 0; j < number; j ++)  {
    				int bw, pc;
    				scanf("%d%d", &bw, &pc);
    				bandWidth[i].push_back(bw);
    				money[i].push_back(pc);
    				maxbw = max(maxbw, bw);
    			}
    		}
    
    		double res = solve_dp(N, maxbw);
    		printf("%0.3f
    ", res);
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3677247.html
Copyright © 2011-2022 走看看