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;
    }
    

      

  • 相关阅读:
    《Expert .NET 2.0 IL Assembler》 译者笔记 2
    游戏大厅升级日记 第2天
    《Metadata Tables》 Authors
    随便写写,蛮有趣的
    《Metadata Tables》 Introduction
    Oracle跨数据库的数据操作
    要换工作环境了
    javascript中几种操作打印的方法
    Datagrid中实现单选功能
    C#中利用Oracle事务删除表
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3677247.html
Copyright © 2011-2022 走看看