【9.14NOIP模拟pj】wtaxi

题目简化

有K辆车,N个人,上车给D元,只有S分钟。上车后无论多少人都要给D元,原地等多少分钟就没了多少元。求最小花费的钱。


我的思路

毫无疑问,此题可以用搜索做,DFS和BFS都行。

程序1

设三个参数,分别为(第l辆车,共花了sum元,还剩下m人)。花的时间在后面加上,否则有点麻烦一点。

两种情况:选或不选

不选 l+1;

选 l+1,已经花的钱+时间*上车人数+上车需要的钱(D),m-上车的人

程序2

我觉得,纯暴搜定然不过,所以加个记忆化。因为记忆化必须要在后面的操作一样时,才可以比较,取最优的。设bz[l,m]表示在第l辆车,剩m人时花的最少钱(sum)

和sum比较即可

程序3.1

我担心第二代程序过不了,再加了一层优化。有时,剩下的人即使将剩下的车全坐满,仍然不够。所以判断m和剩下的座位之和的关系,若m比其还大,则退出,因为即使后面的坐满,仍不能全走。

(未试过)程序3.2

已经满的车无需考虑


所以,此题可用**DFS+记忆化+剪枝**AC之

程序实践3.1

C++

#include <cstdio>
#include <cstring>
#include <cmath>
#include <climits>
using namespace std;
int n,k,d,s;
int t[101],z[101];
int bz[101][101],sm[102];//bz见上,sm[i]表示到i辆车时剩下的车最多能坐的人数(包括i)
int ans=INT_MAX;
int min_a_b(int a,int b)
{
if (a<b) return a;
return b;
}
void go(int l,int sum,int m)
{
if (sum>bz[l][m]) return;
bz[l][m]=sum;//记忆化操作,把大于之前的排除
if (sm[l]<m) return;//剪枝操作,把大于最大座位的人数排除
if (m<=0)
{
if (sum<ans) ans=sum;//替换ans
return;
}
if (l>k) return;//车没了,人还在的情况
go(l+1,sum+min_a_b(z[l],m)*t[l]+d,m-min_a_b(z[l],m));//选
go(l+1,sum,m);//不选
return;
}
int main()
{
freopen("wtaxi.in","r",stdin);
freopen("wtaxi.out","w",stdout);
int i,j;
scanf("%d%d%d%d",&n,&k,&d,&s);
for(i=1;i<=k;i++)
{
scanf("%d%d",&t[i],&z[i]);
}
for(sm[k+1]=0,i=k;i>0;i--)
{
sm[i]=sm[i+1]+z[i];//求剩下车中最大座位
}
memset(bz,127,sizeof(bz));//初始化
go(1,0,n);
if (ans==INT_MAX)
{
printf("impossible\n");
return 0;
}
printf("%d\n",ans);
return 0;
}

Pascal

var
n,k,d,s:longint;
i,j:longint;
t,z:array[0..100]of longint;
bz:array[0..100,0..100]of longint;//bz见上
sm:array[0..101]of longint;//sm[i]表示到i辆车时剩下的车最多能坐的人数(包括i)
ans:longint=maxlongint;
function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end;
procedure go(l,sum,m:longint);
begin
if sum>bz[l,m] then exit;
bz[l,m]:=sum;//记忆化操作,把大于之前的排除
if sm[l]<m then exit;//剪枝操作,把大于最大座位的人数排除
if m<=0 then
begin
if sum<ans then ans:=sum;//替换ans
exit;
end;
if l>k then exit;//车没了,人还在的情况
go(l+1,sum+min(z[l],m)*t[l]+d,m-min(z[l],m));//选
go(l+1,sum,m);//不选
end;
begin
assign(input,'wtaxi.in');reset(input);
assign(output,'wtaxi.out');rewrite(output);
readln(n,k,d,s);
for i:=1 to k do readln(t[i],z[i]);
sm[k+1]:=0;
for i:=k downto 1 do sm[i]:=sm[i+1]+z[i];//求剩下车中最大座位
fillchar(bz,sizeof(bz),127);//初始化
go(1,0,n);
if ans=maxlongint then
begin
writeln('impossible');
close(input);
close(output);
halt;
end;
writeln(ans);
close(input);
close(output);
end.

总结

  1. 类似于这样的题可以用搜索做
  2. 记忆化可以加快程序速度,但要保证程序是正确的,只是删掉不必要的运算

    1.不一定要保证前面走过的路一样

    2.要保证后面的路一样,它们要在同一可以比较的点上,才能记忆化,取最优的
  3. 剪枝也可以删掉一些不必要的运算,但它是根据最不利原则,求出的一个范围,把范围外的去掉

【9.14NOIP模拟pj】wtaxi 题解——搜索的更多相关文章

  1. 【9.14NOIP模拟pj】wtaxi 题解

    [9.14NOIP模拟pj]wtaxi 搜索

  2. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  3. Python模拟百度自动输入搜索功能

    # 访问百度,模拟自动输入搜索 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要对应版本的C ...

  4. CF912E Prime Gift题解(搜索+二分答案)

    CF912E Prime Gift题解(搜索+二分答案) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1314956 洛谷题目链接 $     $ CF题目 ...

  5. csps模拟87888990部分题解

    题面:https://www.cnblogs.com/Juve/articles/11752338.html https://www.cnblogs.com/Juve/articles/1175241 ...

  6. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 12  Solved: 9[Submit][Status][Web Boar ...

  7. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  8. NOIP模拟赛 华容道 (搜索和最短路)蒟蒻的第一道紫题

    题目描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 B 玩的华容道 ...

  9. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

随机推荐

  1. [转] 如何在vps上安装和登录Xwindows

    如何VPS也可以拥有像windows一样图形窗口,这里写个教程,据说xwindows是一个比微软windows还强大的linux图形界面,怎样强大,我也是听说的,你可以自己去试,然后告诉我. vps安 ...

  2. plugin python was not installed: Cannot download ''

    problem: plugin python was not installed: Cannot download ''........ 1. the first method of resoluti ...

  3. 剑指offer——03替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   注意事项: <剑指o ...

  4. [POI2011]SMI-Garbage

    题目描述 http://main.edu.pl/en/archive/oi/18/smi The Byteotian Waste Management Company (BWMC) has drast ...

  5. 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)

    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...

  6. 使用neo4j图数据库的import工具导入数据 -方法和注意事项

    背景 最近我在尝试存储知识图谱的过程中,接触到了Neo4j图数据库,这里我摘取了一段Neo4j的简介: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌 ...

  7. 用CSS做导航菜单的4个理由

    导航结构在网站设计中是起到决定性作用的,导航菜单/栏常常通过颜色.排版.形状和一些图片来帮助网站创造更好的视觉和感受,它是网页设计的关键元素.虽然网站导航菜单的外观是网页设计中关系到整个设计成败与否的 ...

  8. vue echart例——柱状图及高度自适应

    1.安装 npm install echarts -s 2.例——点击tab切换时柱状图重绘,高度根据返回数据设置. <template> <div> <ul id=&q ...

  9. OC开发系列-类与对象

    面向对象 面向对象思想是一种解决问题的思想, 不在是面向过程的去思考问题怎样解决.面向对象解决问题时首先要考虑需要找几个对象能解决这个问题. 常见的概念: * Object Oriented 面向对象 ...

  10. python_django_models模块

    django中models模块为各类数据库提供了统一的api,可根据不同的业务需求配置数据库. models模块开发流程: 配置数据库  详情:https://www.cnblogs.com/Vera ...