题目描述
在ICPC程序设计大赛期间,小P作为志愿者的任务是给各个学校送盒饭,小P一次最多可以携带M份盒饭。总共有N个学校来参加比赛,这N个学校的休息点在一条笔直的马路边一字排开,路的一头是小P取盒饭的地方,假设为原点,每两个相邻点之间,小明需要行走15秒,包括从原点到第一个休息点,交付一份盒饭需要3秒时间。从第一个休息点到第N个休息点需要的盒饭数分别为 a1, a2, a3..., an。 问小P最短需要多少时间把全部盒饭送完并回到原点。
输入
第一行输入一个正整数T,表示有T组测试数据,每组占两行,第一行两个整数M、N(0<M,N<50),第二行输入N个整数a1 a2 a3 ...an (0<=a1....an<50)
输出
每行输出一个整数,对应一组测试数据,表示小P送完全部盒饭并返回原点的总时间(秒)。
样例输入 Copy
2
18 2
8 6
10 3
5 0 8
样例输出 Copy
102
159
提示
消耗的时间最少只由走的路程最短决定,每一趟来回走的路程是这一次送餐的最远的点距离原点的两倍。

我的错误:

//M份盒饭。  总共有N个学校来参加比赛
//每两个相邻点之间,小明需要行走15秒
//交付一份盒饭需要3秒时间
//102=15*(n*2)+(A1+A2+An)*3
//a1 a2 a3 a4
#include<iostream>
using namespace std;
int main() {
int t,n,sum=,book,a,b,i,j;//book表示手里拿的东西 t表示时间
cin>>n;//几组数据
while(n--){
cin>>a>>b;
int arr[b];
book=a;
t=;
sum=;
for( i=;i<b;i++) {
cin>>arr[i];
sum+=arr[i];} for(j=b-;j>=;j--){
book=book-arr[j];
while(book<=){
if(i==&&book==) break;
t+=(j+)**;
book=book+a;
}
}
t=t+b**+sum*;
cout<<t<<endl;
} }

错误分析主要是送最远的饭的目标寻找没考虑,考虑后正确

//M份盒饭。  总共有N个学校来参加比赛
//每两个相邻点之间,小明需要行走15秒
//交付一份盒饭需要3秒时间
//102=15*(n*2)+(A1+A2+An)*3
//a1 a2 a3 a4
#include<iostream>
using namespace std;
int main() {
int t,n,sum=,book,a,b,i,j,q;//book表示手里拿的东西 t表示时间
cin>>n;//几组数据
while(n--){
cin>>a>>b;
int arr[b];
book=a;
t=;
sum=;
for( i=;i<b;i++) {
cin>>arr[i];
sum+=arr[i];
if(arr[i]>) q=i;
} for(j=q;j>=;j--){
book=book-arr[j];
while(book<){
t+=(j+)**;
book=book+a;
}
}
t=t+(q+)**+sum*;
cout<<t<<endl;
} }

同学用的贪心算法:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int N = ;
int a[N]; int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int T;
cin >> T;
while (T--)
{
int m, n, p = ; //p最后一个有效点
scanf("%d%d", &m, &n);
ll ans = ;
for (int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
if (a[i])
p = i;
}
while (p)
{
ans += p * ; //到p再回原点代价
int t = m; //身上所带物品
while (p && t)
{
int e = min(t, a[p]); //交付
t -= e;
a[p] -= e;
ans += e * ; //交付代价
while (p && !a[p]) //如果当前点已经送完则移动p
p--;
}
}
printf("%lld\n", ans);
} return ;
}

分析:

1.从远往近送,

2.确定的最远点需要送餐,arr[i]>0

3.贪心问题,e=min(arr[j],book),很重要

自己实现,差不多,

//M份盒饭。  总共有N个学校来参加比赛
//每两个相邻点之间,小明需要行走15秒
//交付一份盒饭需要3秒时间
//102=15*(n*2)+(A1+A2+An)*3
//a1 a2 a3 a4
#include<iostream>
using namespace std;
int main() {
int t,n,sum=,book,a,b,i,j,p,e;//book表示手里拿的东西 t表示时间
cin>>n;//几组数据
while(n--){
cin>>a>>b;
int arr[b];
book=a;
t=;
sum=;
for( i=;i<b;i++) {
cin>>arr[i];
sum+=arr[i];
if(arr[i]) p=i;
} for(j=p;j>=;j--){
e=min(arr[j],book);
book-=e;
arr[j]-=e;
while(arr[j]>){
t+=(j+)**;
book=a;
e=min(arr[j],book);
book-=e;
arr[j]-=e;
}
}
t=t+(p+)**+sum*;
cout<<t<<endl;
} }

2198: 小P当志愿者送餐的更多相关文章

  1. 在没有APP的125年前 印度的外卖小哥是这样送餐

    说到印度,你想到的是什么?咖喱.歌舞剧.开挂的火车?通通不是,我今天要说的是他们的外卖小哥,在印度如同"神"一般的存在.其实印度人不叫这批人为外卖小哥,而称他们为dabbawala ...

  2. 微信小程序--消息推送配置Token令牌错误校验失败如何解决

    微信开放第三方API接口, 申请地址: https://mp.weixin.qq.com/advanced/advanced?action=interface&t=advanced/inter ...

  3. 【状压dp】送餐员

    [odevs2800]送餐员 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号 ...

  4. Java实现 微信小程序 + 消息推送

    实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open- ...

  5. 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...

  6. 微信小程序消息推送,前端操作

    <form bindsubmit="getFormId" report-submit="true"> <button form-type=&q ...

  7. luogu P1608 路径统计

    题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...

  8. 洛谷——P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  9. 洛谷 P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

随机推荐

  1. Xmanager power suit 6 最新版注册激活

    Xmanager Power Suit 6.0.0012 最新版注册激活,长期更新 操作步骤 Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能 ...

  2. 讲解wpe抓包,封包

    相信大多数朋友都是会使用WPE的,因为这里也有不少好的教程,大家都辛苦了!先说说接触WPE的情况.当时好像是2011年,我本来不知道WPE对游戏竟有如此大的辅助作用的.起先找WPE软件的时候,只是因为 ...

  3. Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复

    由于安装双系统后,Linux 用的比较少.因此,从Win 10 磁盘管理中删除了linux 占用的磁盘空间,重启后无法进入win 10 ,出现如下情况: 有人提出,此时需要重装系统,并不用如此麻烦,通 ...

  4. March 08th, 2018 Week 10th Thursday

    Easy come, easy go. 易得则易失. Easy come, easy go, I finally undestand the phrase through somewhat hard ...

  5. Markdown语法大全

    目录 前言: 1.Markdown基础用法 1.1 目录 1.2 标题 1.3 字体样式 1.4 引用 1.5 图片 1.6 超链接 1.7 列表 1.8 表格 1.9 代码 1.10 流程图 1.1 ...

  6. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  7. DB2常见错误信息

    000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互联系的引用+098 01568 动态SQL语句用分号结束+100 0 ...

  8. 深入理解Java 注解原理

    *注解的用途 注解(Annotation)是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代码中的一些元信息,将一个类的外部信息与内部成员联系起来,在编 译. ...

  9. sqlachemy 查询当日数据,

    Tokens.query.filter(Tokens.user_id == user_id, db.cast(Tokens.create_time, db.DATE) == db.cast(curre ...

  10. .NET Core微服务实施之Consul服务发现与治理

    .NET Core微服务实施之Consul服务发现与治理   Consul官网:https://www.consul.io Consul下载地址:https://www.consul.io/downl ...