【PAT甲级】1033 To Fill or Not to Fill (25 分)(贪心,思维可以做出简单解)
题意:
输入四个正数C,DIS,D,N(C<=100,DIS<=50000,D<=20,N<=500),分别代表油箱容积,杭州到目标城市的距离,每升汽油可以行驶的路程,加油站数量。接下来输入N行数据,每行包括一个小数代表该加油站每升汽油的价格和该加油站距离杭州的距离。输出杭州到该城市的最小加油花费,如果到不了的话输出离开杭州的最远路程。
思路:
每次到一个加油站时都把油箱加满,如果加油站i油箱加满所能行驶的范围内有加油站j油价比i便宜,那么j位置的花费就为i位置的花费减去(油箱加满时的最大行驶范围减去加油站i与j之间的距离)这段路程所需要消耗的汽油的花费再加上一整箱油的花费;如果最大行驶范围内没有比i便宜的加油站,就找一个加油站k是范围内最便宜的,那么k位置的花费就为i位置的花费加上加油站i与k之间的距离这段路程所需要消耗的汽油的花费。中途如果在加油站x加满油后最大路程超过目标城市,就更新ans使得等于当前加油站x的花费减去这箱油跑完超出目标城市距离的油的花费,如果x加油站后有油价更便宜的加油站就继续寻找,如果没有的话直接break,已经是最优解了,后面油价贵的加油站加油后的价格会超出在x加油后直接跑到目标城市的价格。核心想法是贪心,另一种解法是根据该题DIS最大只有30000,可以以加油站的油价从高到低排序,计算出每公里所加油最便宜的价格,以公里为坐标从后向前扫如果有断点(该公里无油可加,前不着村后不着店,则直接输出当前所在公里位置),无断点则将1~DIS每一公里所需的油价相加即为答案,我认为这样贪心需要考虑的地方较少,处理起来比较清晰明了,代码有空再整一个附上。。。
trick:
第1个测试点包含了多个加油站坐标相同的数据。
第2个测试点包含了起点没有加油站的数据。
第4个测试点包含了有多个加油站距离目标城市的距离小于等于邮箱最大容积的行驶距离且距离目标城市越近的加油站油越贵。
第0,6个测试点包含了有多个加油站距离目标城市的距离小于等于邮箱最大容积的行驶距离且距离目标城市越近的加油站油越便宜。
以上数据来自我错误代码的猜测,希望能对卡数据点2或者4(划重点)的朋友有所帮助。
AAAAAccepted code:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
double c,dis,d;
int n;
pair<double,double>a[];
double sum[];
int main(){
cin>>c>>dis>>d>>n;
for(int i=;i<=n;++i)
cin>>a[i].second>>a[i].first;
sort(a+,a++n);
if(a[].first>){
cout<<"The maximum travel distance = 0.00";
return ;
}
sum[]=c*a[].second;
double ans=2e18;
for(int i=;i<=n;++i){
double mn=2e18;
int pos=;
for(int j=i+;j<=n;++j){
if(a[j].first-a[i].first>c*d)
break;
if(a[j].second<a[i].second){
pos=j;
break;
}
if(a[j].second<mn){
mn=a[j].second;
pos=j;
}
}
if(!pos&&i<n){
cout<<"The maximum travel distance = ";
printf("%.2f",a[i].first+c*d);
return ;
}
if(a[i].first+c*d>=dis){
ans=min(ans,sum[i]-(a[i].first+c*d-dis)/d*a[i].second);
int flag=;
for(int j=i+;j<=n;++j)
if(a[j].second<a[i].second)
flag=;
if(!flag)
break;
}
if(a[pos].second<a[i].second)
sum[pos]=sum[i]-(c*d-(a[pos].first-a[i].first))/d*a[i].second+a[pos].second*c;
else
sum[pos]=sum[i]+(a[pos].first-a[i].first)/d*a[pos].second;
if(i<n)
i=pos-;
}
if(a[n].first+c*d<dis){
cout<<"The maximum travel distance = ";
printf("%.2f",a[n].first+c*d);
}
else
printf("%.2f",ans);
return ;
}
【PAT甲级】1033 To Fill or Not to Fill (25 分)(贪心,思维可以做出简单解)的更多相关文章
- PAT 甲级 1067 Sort with Swap(0, i) (25 分)(贪心,思维题)*
1067 Sort with Swap(0, i) (25 分) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is ea ...
- PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题
1043 Is It a Binary Search Tree (25 分) A Binary Search Tree (BST) is recursively defined as a bina ...
- 【PAT甲级】1106 Lowest Price in Supply Chain (25分)
题意:输入一个正整数N(<=1e5),两个小数P和R,分别表示树的结点个数和商品原价以及每下探一层会涨幅的百分比.输出叶子结点深度最小的商品价格和深度最小的叶子结点个数. trick: 测试点1 ...
- 【PAT甲级】1097 Deduplication on a Linked List (25 分)
题意: 输入一个地址和一个正整数N(<=100000),接着输入N行每行包括一个五位数的地址和一个结点的值以及下一个结点的地址.输出除去具有相同绝对值的结点的链表以及被除去的链表(由被除去的结点 ...
- 【PAT甲级】1090 Highest Price in Supply Chain (25 分)
题意: 输入一个正整数N(<=1e5),和两个小数r和f,表示树的结点总数和商品的原价以及每向下一层价格升高的幅度.下一行输入N个结点的父结点,-1表示为根节点.输出最深的叶子结点处购买商品的价 ...
- 【PAT甲级】1079 Total Sales of Supply Chain (25 分)
题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结 ...
- 【PAT甲级】1067 Sort with Swap(0, i) (25 分)
题意: 输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列).每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序. AAAAAccepted cod ...
- 【PAT甲级】1006 Sign In and Sign Out (25 分)
题意: 给出学生人数M,输入M组学生ID,到机房的时间,离开机房的时间.输出最早到机房的学生的ID,空格,最后离开机房的学生的ID.(M大小未给出,就用了1e5) AAAAAccepted code: ...
- PAT甲级1033. To Fill or Not to Fill
PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...
随机推荐
- C++子类虚函数表指针
最近看剑指offer,记录一下 #include <iostream> #include <string> #include <cctype> #include&l ...
- 排序算法之快速排序的python实现
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序. 快速排序算法的工作原理如下: 1. 从数列中挑出一个元 ...
- Flume基础学习
Flume是一款非常优秀的日志采集工具.支持多种形式的日志采集,作为apache的顶级开源项目,Flume再大数据方面具有广泛的应用 首先需要在Flume的解压目录中conf文件夹中将flume-en ...
- 安卓开发:Android Studio自动import
我只想说,真好用!哈哈,提高效率的好东西. 参考: [https://blog.csdn.net/pjdd123/article/details/80953669] [https://www.cnbl ...
- java_设计模式_装饰设计模式
package IO; /* * 装饰设计模式 模拟咖啡 * 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) * 2.具体组件:需要装饰的对象 * 3.抽像装饰类:包含了对抽象组件的引用以及装饰着 ...
- IE6下的png不透明问题
前几天刚做完一个小需求,但是在兼容ie方面用了比较久的时间,主要是切面那边用的背景图都是png格式的,而经过查找知道,ie6对png图片透明部分渲染效果是不透明的,我看到的是淡淡的绿色,简单的处理方式 ...
- Git基础及进阶-系统总结
Git基础及进阶-系统总结 by 小强 2019-07-01 考虑到入职后不仅需要熟练掌握git的基本使用,在企业实际操作中还涉及一些进阶指令.作为一个程序员,熟练使用工具是一项基本技能,也是程序员的 ...
- ASP.NET Core搭建多层网站架构【8.1-使用ViewModel注解验证】
2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.1-使用ViewModel注解验证] 使用V ...
- 如何使用 Workman 做一个聊天室
一:首先,得简单说说 thinkphp+workerman 的安装. 安装 thinkphp5.1 composer create-project topthink/think=5.1.x-dev t ...
- VUE组件 单独文件封装
https://www.cnblogs.com/SamWeb/p/6391373.html vuejs 单文件组件.vue 文件 vuejs 自定义了一种.vue文件,可以把html, css, ...