题意:

输入四个正数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 分)(贪心,思维可以做出简单解)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 【PAT甲级】1106 Lowest Price in Supply Chain (25分)

    题意:输入一个正整数N(<=1e5),两个小数P和R,分别表示树的结点个数和商品原价以及每下探一层会涨幅的百分比.输出叶子结点深度最小的商品价格和深度最小的叶子结点个数. trick: 测试点1 ...

  4. 【PAT甲级】1097 Deduplication on a Linked List (25 分)

    题意: 输入一个地址和一个正整数N(<=100000),接着输入N行每行包括一个五位数的地址和一个结点的值以及下一个结点的地址.输出除去具有相同绝对值的结点的链表以及被除去的链表(由被除去的结点 ...

  5. 【PAT甲级】1090 Highest Price in Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),和两个小数r和f,表示树的结点总数和商品的原价以及每向下一层价格升高的幅度.下一行输入N个结点的父结点,-1表示为根节点.输出最深的叶子结点处购买商品的价 ...

  6. 【PAT甲级】1079 Total Sales of Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结 ...

  7. 【PAT甲级】1067 Sort with Swap(0, i) (25 分)

    题意: 输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列).每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序. AAAAAccepted cod ...

  8. 【PAT甲级】1006 Sign In and Sign Out (25 分)

    题意: 给出学生人数M,输入M组学生ID,到机房的时间,离开机房的时间.输出最早到机房的学生的ID,空格,最后离开机房的学生的ID.(M大小未给出,就用了1e5) AAAAAccepted code: ...

  9. PAT甲级1033. To Fill or Not to Fill

    PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...

随机推荐

  1. 使用Canvas画布的注意事项

    1.开始一个路径时要使用beiginPath()方法 ,不然会发生意想不到的事件. 2.图片加载完成后才能按照顺序依次绘图 (巧用onload时间)

  2. Spring5 of WebClient(转载)

    前言 Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient.WebClient是Spring5中引入的执行 HTTP 请求的非阻塞. ...

  3. 获得APP的包名package和activity

    方法一: Aapt dumpbadging xxxx.apk(包的路径) 第一个框为包名 第二个框为主Activity名 方法二: 如果你装了Appium 可以这么操作下 进入设置页,选择APK  路 ...

  4. wcftestclient test soap API

    soap 类API测试方法: 1. 打开developer command prompt, 输入:wcftestclient 2. 选中“My Service Project”, 再Add servi ...

  5. python中getpass模块

    1 import getpass 2 name = input('请输入你的名字:') 3 passwd = getpass.getpass('请输入你的密码:') 4 print(name) 5 p ...

  6. 基于PowerCli自动部署和配置vmvare虚拟机

    1 文档说明 2 Vsphere PowerCli安装和配置 3 PowerCli常用命令 4 创建自定义规范 5 虚拟机克隆与配置脚本 6 技术资料 1 文档说明 使用Vsphere管理虚拟机,在进 ...

  7. Mybatic逆向工程的使用

    前言:利用别人的方法.知识.经历或精神成为你自己,不思考不实践不总结不反馈,就不会变成你的. 转载必须表明出处:https://www.cnblogs.com/fby698/p/9463831.htm ...

  8. 使用$.ajax时的注意事项

    做PHP难免接触js,我也是这样,使用ajax的时候,我比较习惯使用$.ajax({}),这种方式,因为通用性较强.有时候会较少使用js,隔一段时间后再使用,有些细节内容容易模糊不清,这一次,我又忘记 ...

  9. 【模板】凸包向内推进求不严格的半平面交——poj3384

    想不明白这题写严格的半平面交为什么会错 /* 凸包所有边向内推进r */ #include<iostream> #include<cstring> #include<cs ...

  10. Android、iOS与Servlet接口上传文件和JSON串的交互

    package etcom.servlet; import java.io.File; import java.io.IOException; import java.sql.Connection; ...