pat 1033 To Fill or Not to Fill(值得重点回顾)
来源:互联网 发布:智慧镇江网络错误 编辑:程序博客网 时间:2024/05/21 16:44
有点难度的贪心题,贪心策略有点绕,得静下心来分析,同时得增强自己的代码能力。实质是汽车加油问题。
贪心策略:假设现在自己处于A站,要考虑的是A站要不要加油,加多少油的问题。找到下一个要加油的站B(距离A站cmax*davg范围内的最便宜的站)。
1. A站油价比B价高,现在油箱里还有油,能跑到B站,那就不加油,直接跑去(这里B站跟2,3情况不同,是距离A站currGas*davg范围内的最便宜的站)
2. A站油价比B价高,现在油箱没油,跑不到B站,为了减少花销,尽量少加油,只加能跑到B站的油。
3. A站油价比B价低,则不管油箱有没有油,跑不跑得到B站,尽量加满油。
AC代码:
//1033 20:23#include<cstdio>#include<cstdlib>const int NUM=505;const int INF=0x7fffffff;struct station{ double price; double dist;}s[NUM];int cmp(const void *a,const void *b){ station *x=(station *)a; station *y=(station *)b; return x->dist - y->dist;}int main(){ int i,j,n,davg; int flag=1,index; double dest,cmax; //freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin); scanf("%lf%lf%d%d",&cmax,&dest,&davg,&n); for(i=0;i<n;i++){ scanf("%lf%lf",&s[i].price,&s[i].dist); } s[n].price=0; s[n].dist=dest; double step=cmax*davg; double currGas=0; double minPrice,sum=0; qsort(s,n,sizeof(s[0]),cmp); if(s[0].dist>0){ printf("The maximum travel distance = 0.00\n"); return 0; } else { for(i=0;i<n;){ if(s[i+1].dist-s[i].dist>step){ flag=0; printf("The maximum travel distance = %.2lf\n",s[i].dist+step); break; } else { index=i; minPrice=s[i].price; //1.现在有油, for(j=i+1;s[j].dist-s[i].dist<=currGas*davg&&j<=n;j++){//找现有油箱能跑到的比现在最便宜的油站 if(s[j].price<minPrice){ index=j; minPrice=s[j].price; } } if(index!=i){//现在有油,找到了比现在油站价格最便宜的油站(不加油能到),就直接开过去,不加油,到那再加 currGas-=(s[index].dist-s[i].dist)/davg;//耗油 i=index; continue; } index=i; //minPrice=s[i].price; //2.现在没油或所能到的油站价格都比现在油站贵 for(j=i+1;s[j].dist-s[i].dist<=step&&j<=n;j++){//找最近的比现油站便宜的油站 if(s[j].price<minPrice){ index=j; break; } } if(index!=i){//现在没油或现油箱所能到的油站价格都比现在油站贵:要去最近的比现油站便宜的油站(不加油到不了),得在现油站加上刚好满足的油量 sum+=((s[index].dist-s[i].dist)/davg-currGas)*s[i].price; currGas=0; //printf("%.2lf\n",sum); i=index; continue; } //3.现在有油或没油,没找到比现在便宜的油站,当然是在现油站加满,再到下一个次便宜的油站 index=i; minPrice=INF; for(j=i+1;s[j].dist-s[i].dist<=step&&j<=n;j++){//找接下来step范围内的最便宜油站 if(s[j].price<minPrice){ index=j; minPrice=s[j].price; } } sum+=(cmax-currGas)*s[i].price;//没找到比现在便宜的油站,当然是在现油站加满,再到下一个次便宜的油站 currGas=cmax-(s[index].dist-s[i].dist)/davg; //printf("%.2lf\n",sum); i=index; } } } if(flag==1) printf("%.2lf\n",sum); return 0;}
- pat 1033 To Fill or Not to Fill(值得重点回顾)
- pat 1033 To Fill or Not to Fill
- PAT 1033 To Fill or Not to Fill 贪心
- 【PAT 1033】To Fill or Not to Fill
- PAT A1033 to fill or not to fill(25)
- 1033. To Fill or Not to Fill (25)-PAT
- 【PAT】1033. To Fill or Not to Fill (25)
- PAT 1033. To Fill or Not to Fill (25)
- PAT 1033. To Fill or Not to Fill (25)
- PAT 1033. To Fill or Not to Fill
- PAT 1033. To Fill or Not to Fill
- PAT A 1033. To Fill or Not to Fill (25)
- PAT 1033. To Fill or Not to Fill (贪心)
- PAT 1033. To Fill or Not to Fill (25)(贪心)
- PAT (Advanced) 1033. To Fill or Not to Fill (25)
- PAT 1033. To Fill or Not to Fill (25)
- pat 1033. To Fill or Not to Fill (25)
- PAT 1004 To Fill or Not to Fill (25)
- FIT和FitNesse使用方法
- c# Linq操作DataTable
- 各种缓存技术及使用场景
- ActionBar与ActionMode初体验
- cocos2d-iphone之魔塔20层
- pat 1033 To Fill or Not to Fill(值得重点回顾)
- HTML5 – 一个拖拽功能的例子
- 2_20130306_UI需要修改的地方
- C/C++开源库——TinyXml
- iOS-raywenderlich翻译-使用MapKit叠加图层
- Android实用代码七段
- 获得心灵安宁的7个技巧
- Android之ActionBar学习
- 东野圭吾《流星之绊》读后感