您的位置:首页 > 编程语言

2014百度之星初赛第二轮代码注释:Best_Financing

2015-01-23 16:35 127 查看
http://star.baidu.com/forum/forum.php?mod=viewthread&tid=3187&page=&extra=#pid39826

题链接

#define  _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>

const int MAX_N = 2500;
const int MAX_M = 2500;

int n;
int m;
int dates[MAX_N];
int earnings[MAX_N];
int start[MAX_M];
int finish[MAX_M];
int interest_rates[MAX_M];
int best[MAX_M];

long long max_profit()
{
//排序理财产品,按时间排序,好像是冒泡吧
for (int i = 0; i < m; ++i) {
for (int j = i; j > 0 && start[j] < start[j - 1]; --j) {//从i为1开始
std::swap(start[j], start[j - 1]);
std::swap(finish[j], finish[j - 1]);
std::swap(interest_rates[j], interest_rates[j - 1]);
}
}

for (int i = m - 1; i >= 0; --i) {//遍历理财产品
int b = 0;
for (int j = i + 1; j < m; ++j) {
if (finish[i] <= start[j]) {//前一个的结束日期<=后一个的开始开始日期
b = std::max(b, best[j]);
}
}
best[i] = interest_rates[i] + b;
}

long long res = 0;
for (int i = 0; i < n; ++i) {//遍历收入日期
int b = 0;
for (int j = 0; j < m; ++j) {//遍历理财产品
if (dates[i] <= start[j]) {//收入日期<=理财产品开始日期
b = std::max(b, best[j]);
}
}
res += (long long) b * earnings[i];
}

return res;
}

int main()
{
int T;
freopen("d:\\uva_in.txt","r",stdin);
std::cin >> T;
for (int case_num = 1; case_num <= T; ++case_num) {
std::cin >> n >> m;
for (int i = 0; i < n; ++i) {
std::cin >> dates[i] >> earnings[i];
}
for (int i = 0; i < m; ++i) {
std::cin >> start[i] >> finish[i] >> interest_rates[i];
}
long long res =  max_profit();
fprintf(stdout, "Case #%d:\n%.2f\n", case_num, res / 100.0);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: