【洛谷 1016】 旅行家的预算
来源:互联网 发布:linux下jdk怎么卸载 编辑:程序博客网 时间:2024/05/23 15:48
思路
贪心经典题。要把所有的加油站先排序,之后扫一遍,每一个加油站是否加油主要看从这个加油站开始,能走的路程里面是否存在一个比这个加油站便宜的:
- 如果存在,找到第一个比他便宜的,加油加到这里;
- 如果不存在,就把油加满,走到哪里算哪里。
代码
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef double db;struct node{ db dis, val; bool operator < (const node & a)const{ return dis == a.dis ? val < a.val : dis < a.dis; }};node p[110];db d1, c, d2, p1, max_dis = 0;int n, t;int main(){ cin >> d1 >> c >> d2 >> p1 >> n; max_dis = c * d2; p[++t].dis = 0, p[t].val = p1; p[++t].dis = d1, p[t].val = 0; t ++; for(int i = 1; i <= n; i ++, t ++) cin >> p[t].dis >> p[t].val; t --; sort(p+1, p+1+t); db left = 0, cost = 0; for(int i = 1; i < t; i ++){ int to = i, pos; db min_cost = p[i].val; left -= ((p[i].dis - p[i-1].dis) / d2); while(p[to+1].dis - p[i].dis <= max_dis){ to ++; if(p[to].val < min_cost){ min_cost = p[to].val; pos = to; break; } } if(to == i){ printf("No Solution"); return 0; } if(min_cost >= p[i].val){ cost += (c-left) * p[i].val; left = c; }else if(left*d2 < p[pos].dis - p[i].dis){ db tt = ((p[pos].dis - p[i].dis) / d2 - left); cost += tt * p[i].val; left += tt; } } printf("%.2f", cost); return 0;}
光看初赛了,好久不写了,写的真丑。。。
0 0
- 【洛谷 1016】 旅行家的预算
- 洛谷1016 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 旅行家的预算
- 洛谷 1016 [NOIP1999] 旅行家的预算 贪心
- 洛谷 P1016 旅行家的预算
- 贪心-旅行家的预算
- #NOIP1999#旅行家的预算
- [NOIP1999]旅行家的预算
- 【a701】旅行家的预算
- [codevs1046]旅行家的预算
- 洛谷 P1016 [NOIP1999 T2] 旅行家的预算
- 贪心——洛谷P1016 旅行家的预算
- java引用数据类型-数组
- PHP7扩展开发入门
- java-数组赋值
- Leetcode 438. Find All Anagrams in a String 找变位子串 解题报告
- 交叉编译(cross compile)的一些介绍
- 【洛谷 1016】 旅行家的预算
- list.addAll()是浅拷贝,如何实现list的深拷贝
- 看不懂的python矩阵处理
- Android api level对照表
- Android ViewGroup指定子View的绘制顺序
- 第2 天
- 第七周项目3——负数把正数赶出队列
- onchange事件,在chrome浏览器4.30版本失效问题
- Java泛型入门