1033. To Fill or Not to Fill (25)

来源:互联网 发布:java红黑树删除 编辑:程序博客网 时间:2024/05/29 15:14
#include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <algorithm>using namespace std;struct station {double dist;double price;bool operator<(const station &b) const {return dist < b.dist;}};int main(int argc, char **argv) {double c, d, da;int n;cin >> c >> d >> da >> n;vector<station> ss;for(int i = 0; i < n; i ++) {station s;scanf("%lf %lf", &s.price, &s.dist);// cin >> s.price >> s.dist;if(s.dist < d)ss.push_back(s);}station s = { d, 0 };ss.push_back(s);sort(ss.begin(), ss.end());double cost = 0;double cc = 0;bool flag = true;double ld;if(ss[0].dist == 0) {for(int i = 0; ss[i].dist <= d && i < ss.size(); i ++) {int j;bool cheaper = false;for(j = i+1; j < ss.size() && ss[i].dist + c*da >= ss[j].dist; j ++) {if(ss[j].price < ss[i].price) {cheaper = true;break;}}if(cheaper) {double tmpc = cc - (ss[j].dist-ss[i].dist)/da;if(tmpc >= 0) {cc = tmpc;}else {cost -= tmpc*ss[i].price;cc = 0;}i = j-1;}else {cost += (c - cc)*ss[i].price;if(i+1 < ss.size()) {double d = ss[i+1].dist - ss[i].dist;if(d <= c*da)cc = c - (ss[i+1].dist-ss[i].dist)/da;else {flag = false;ld = ss[i].dist + c*da;break;}}}}}else {flag = false;ld = 0;}if(flag) {printf("%.02lf\n", cost);}else {printf("The maximum travel distance = %.02lf\n", ld);}return 0;}

0 0
原创粉丝点击