poj 1018 Communication System
2015-06-21 23:32
483 查看
方法一:枚举 需要求出每一组设备中带宽的最小值中的最小值minb,每组设备中宽带的最大值中的最小值,在遍历带宽i的时候,需要求出价格和的最小值
方法二:dp做法,dp[i][j] = max (dp[i][j], dp[i - 1][j] + p[i][j]);
#include<string.h> #include<math.h> #include<fstream> #include<algorithm> #include<stdio.h> #include<queue> #include<vector> #define MAXSIZE 100 using namespace std; const int INF = 1<<30; int t = 0, n = 0; int p[101][101], b[101][101]; int minn = INF, maxn = 0; int from = 0, to = 0; int used[101]; double maxans = 0; int num[101]; int main() { //freopen("data_1018.txt","r",stdin); scanf("%d", &t); from = INF; to = INF; while(t--) { memset(used, 0, sizeof(used)); from = INF; to = INF; scanf("%d", &n); for (int i = 0; i < n; i++) { minn = INF; maxn = 0; scanf("%d", &num[i]); for (int j = 0; j < num[i]; j++) { scanf("%d%d", &b[i][j], &p[i][j]); used[b[i][j]] = 1; if (minn > b[i][j]) { minn = b[i][j]; } if (maxn < b[i][j]) { maxn = b[i][j]; } } if (from > minn) { from = minn; } if (to > maxn) { to = maxn; } } from = minn; to = maxn; int psum = 0; int minp = INF; for (int i = from ; i <= to; i++) { maxans = 0; if (used[i]) { psum = 0; for (int j = 0; j < n; j++) { minp = INF; for (int k = 0; k < num[j]; k++) { if (b[j][k] >= i) { if (minp > p[j][k]) { minp = p[j][k]; } } } psum += minp; } if (maxans < i * 1.0 / psum) { maxans = i * 1.0 / psum; } } } printf("%.3lf\n", maxans); } return 0; }
方法二:dp做法,dp[i][j] = max (dp[i][j], dp[i - 1][j] + p[i][j]);
#include<string.h> #include<math.h> #include<fstream> #include<algorithm> #include<stdio.h> #include<queue> #include<vector> #define MAXSIZE 100 using namespace std; const int INF = 1<<30; int t = 0, n = 0; int dp[1001][1001]; int b[101][101], p[101][101], num[101]; int main() { //freopen("data_1018.txt","r",stdin); scanf("%d", &t); int maxb = 0; while(t--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); for (int j = 1; j <= num[i]; j++) { scanf("%d%d", &b[i][j], &p[i][j]); if (maxb < b[i][j]) { maxb = b[i][j]; } } } memset(dp,0x3f,sizeof(dp)); for (int i = 0; i <= maxb; i++) { dp[0][i] = 0; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= num[i]; j++) { for (int k = 1; k <= b[i][j]; k++) { dp[i][k] = min (dp[i][k], dp[i - 1][k] + p[i][j]); } } } double maxans = 0; for (int i = 1; i <= maxb; i++) { maxans = max (maxans, 1.0 * i / dp [i]); } printf("%.3f\n", maxans); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP
- Unique Paths I,II, Minimum Path Sum
- Gas Station