ZOJ 3699 Dakar Rally(贪心)
这是一道贪心题,他的贪心思想很容易想明白,我们保证油箱里的油始终是最便宜的我们最后的花费就能是最少的.实现方法就是:比如现在在i点,我们看邮箱满载能最远到达哪里,不妨设最远到达j,(j >= i + 1),注意此处的达到,只是指能够到达这个路段的开头位置,并不是走完这段路...所以我们到达j点会有一个leave剩余,leave >= 0,但是在i 和 j点之间我们只需要到达第一个油价比i点小的路段开头位置,换上新油就可以了,之所以是第一个,是因为题目要求必须从前往后按顺序走,不妨设中间有没有出现这样的加油站这个命题为flag,若找到flag为true,没找到flag为false.
下面开始讨论,如果flag = true,则我们可以不需要加满油,只需要到达油价低的点就可以了
如果flag = false,就会出现两种情况,如果j < n,即未能走完第n个点,我们需要加满油,但是j >= n点时,我们可以不用加满油,既然贪心就是最优,不能走完了以后还有剩下的油.
这个题实话说我错了好多次,hustvj都快被我刷屏了,可能是因为循环不太好控制,我一开始用的for,后来换了while,又看了别人的写法,才纠正过来.正如到油价最低点那段代码,其实可以直接过去,但我还是选择了i++的形式,花样作死玩怕了...还是稳重AC吧.
另外除了直接循环的方式,还可以用单调队列,某些高端玩家用的这种方法,感兴趣的百度一下吧.
还有,最后结果用long long,int会爆WA.代码如下:(不要吐槽风格太像,我也不想,改了很多次结果改的跟人家差不多了)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100010
int len[maxn],unit[maxn],price[maxn];
int main()
{
int t,n,all;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&all);
bool flag = true;
for(int i = ; i < n; i++)
{
scanf("%d%d%d",&len[i],&unit[i],&price[i]);
if(len[i] * unit[i] > all)
{
flag = false;
}
}
if(!flag)
{
puts("Impossible");
continue;
}
long long leave = ,ans = ,need = ,i = ,j;
while(i < n)
{
j = i + ;
need = len[i] * unit[i];
while(j < n && price[j]>=price[i] && all - need >= unit[j] * len[j])
{
need += len[j] * unit[j];
++j;
} if(j < n && price[j] >= price[i])///这步讨论别忘了,没有找到也不需要加满的一种情况
{
ans += (all - leave) * price[i];
leave = all - len[i] * unit[i];
i++;
}
else
{
if(leave > need) leave -= need;
else
{
ans += (need - leave) * price[i];
leave = ;
}
i = j;
}
}
printf("%lld\n",ans);
}
return ;
}
ZOJ 3699 Dakar Rally(贪心)的更多相关文章
- ZOJ 3699 Dakar Rally
Dakar Rally Time Limit: 2 Seconds Memory Limit: 65536 KB Description The Dakar Rally is an annu ...
- POJ 1862 & ZOJ 1543 Stripies(贪心 | 优先队列)
题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- 2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)
Numbers Time Limit: 2 Seconds Memory Limit: 65536 KB DreamGrid has a nonnegative integer n . He ...
- ZOJ 2702 Unrhymable Rhymes 贪心
贪心.能凑成一组就算一组 Unrhymable Rhymes Time Limit: 10 Seconds Memory Limit: 32768 KB Special Judge ...
- ZOJ 3946 Highway Project 贪心+最短路
题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946 题解: 用dijkstra跑单元最短路径,如果对于顶点v,存 ...
- zoj 2921 Stock(贪心)
Optiver sponsored problem. After years of hard work Optiver has developed a mathematical model that ...
- zoj 1375||poj 1230(贪心)
Pass-Muraille Time Limit: 2 Seconds Memory Limit: 65536 KB In modern day magic shows, passing t ...
- POJ - 2349 ZOJ - 1914 Arctic Network 贪心+Kru
Arctic Network The Department of National Defence (DND) wishes to connect several northern outposts ...
- ZOJ 3870 Team Formation 贪心二进制
B - Team Formation Description For an upcoming progr ...
随机推荐
- CDN技术详解及实现原理
CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...
- php:sprintf
十六进制 $hex = sprintf("%x",18); 输出:12(%x表示十六进制) $hex = sprintf("%4x",18); 输出:strin ...
- vs设计界面出现“建控件时出错 响应在此上下文中不可用”
使用VS2010设计Asp.net时出现: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态.还请确保在应用程序配置的 \\ 节中包括 ...
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...
- 修改某个UITextField的键盘的返回键类型以及监听键盘的高度变化,取到键盘动画退出弹出的时间,一起随着键盘顶出来或者压下去,
1.修改某个UITextField的键盘的返回键类型: [_bottomTextView setReturnKeyType:UIReturnKeyDone]; 1.1.textFied点击return ...
- namenode ha
http://blog.csdn.net/totxian/article/details/45248399 http://www.aboutyun.com/thread-13679-1-1.html ...
- Hibernate主键生成方式之hilo
当利用Hibernate的getHibernateTemplate().save(obj);插入的对象的主键ID为null的时候自动生成5位数的主键ID进行插入. 此笔记的由来: 老夫在此处上传材料后 ...
- wpf无法加载程序集的元数据 可能已从web下载
wpf无法加载程序集的元数据 可能已从web下载 别人写的wpf程序,源代码放到自己电脑上,设计器加载出现问题:无法加载程序集“XXX”的元数据. 解除锁定步骤:找到你的dll->右键属 ...
- 689D Friends and Subsequences RMQ+二分
题目大意:给出两个数组,求第一个数组区间内的最大值和第二个区间内的最小值相同的区间有多少种. 题目思路:通过预处理(O(n*Logn))后,每次查询的时间复杂度为O(1),但是如果暴力查询O(n*n) ...
- java 基础的几种算法
1:冒泡排序:2个之间进行循环筛选 public void sort(int[] a) { int temp = 0; for (int i = a.length - 1; i > 0; i ...