【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 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...
随机推荐
- Java中List集合的逆序排列
Collections.reverse(list); //实现List集合逆序排列
- cpu io disk mem监控 python
import psutil def cpu_information(): #scputimes(user=26.9, nice=0.1, system=50.27, idle=8551.89, iow ...
- 解决vscode出现两个光标的问题
转载自本人独立博客:https://liushiming.cn/2020/01/20/vscode-two-cursors-in-vim-mode/ 问题概述 今天用vscode的vim模式编辑htm ...
- 初识HttpRunner
一.背景 前段时间接触到HttpRunner自动化测试框架,发现对测试人员代码能力要求极低,用户只需准备好用例脚本即可发起测试,非常方便,故记录一下. 二.安装 运行环境 HttpRunner框架基于 ...
- 关于 appium get_attribute 方法的坑
(得要学着看源码) 问题: self.driver.find_element_by_id("id").get_attribute("content-desc") ...
- Go语言基础之os
文章引用自 package os import "os" os包提供了操作系统函数的不依赖平台的接口.设计为Unix风格的,虽然错误处理是go风格的:失败的调用会返回错误值而非错误 ...
- Uva 11300 Spreading the Wealth(贪心)
题目链接:https://vjudge.net/problem/UVA-11300 这道题的思路太神了,但很难想到是贪心. 用M表示每个人最终拥有的金币数. 首先假设有四个人.假设1号给2号3枚,2号 ...
- Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...
- JavaSE复习~开发环境的搭建 与 HelloWorld
JDK的下载 访问Oracle官网,下载jdk,目前来说用的最多的是 8 版本 https://www.oracle.com/technetwork/java/javase/downloads/ind ...
- Bugku-CTF社工篇之王晓明的日记