【一道来自老师的题的题解】equip——奇妙的最短路
这道题真的第一眼完全想不到是最短路啊!!!!!!!!
感谢DR大佬讲解!!!!!90°鞠躬 =u=
暂时没有评测网址,(因为需要special judge)敬请期待
机房另一大佬JYY题解,可以对比参照(说不定就会了呢)<-点这个
(她的博客里有一些问题答疑不懂得去看看哈)
题面:
分析过程依旧来源于老师

为什么可以连图的证明过程忽略(因为我不会
这张图基本就是所有能被表示的数,求出的最短路就是最小能被表示的数,由于它们都对 a[1] 取模,根据这点可以用已求出的数据计算出每种碎片的使用情况,(我们默认能多用 a[1] 就多用)这题是“任意一种方案即可”,所以我们不用考虑“用 n 个 a[ j ] 可以表示 a[ i ] ”的情况
参考代码可能会便于理解思路(代码有超级超级详细的注释哦真的不看看嘛)
/*数组变量解释:
dis 存放最短路值,pre 存放每个价值所用的碎片编号, vis , sum 代码中都有详细解释
*/
#include<bits/stdc++.h>
#define A 20001
#define N 5001
using namespace std;
typedef long long ll;
struct node
{
int x; ll v;
bool operator < (const node &oth) const
{
return v > oth.v;
}//重载运算符实现大根堆
};
priority_queue<node>q;
int pre[A], n, m, K, vis[A];
ll a[N], dis[A], sum[N];
ll getin()
{
ll s = ; char c = getchar();
while (c < '' || c > '') c = getchar();
while (c <= '' && c >= '') s = s * 10ll + c - '', c = getchar();
return s;
}//快读忽略
void dijkstra()
{
for (int i = ; i < a[]; i++) dis[i] = 1e18;
dis[] = ;
q.push((node) {, });
//赋初值
while (!q.empty())
{
int u = q.top().x;//这是当前的点
q.pop();
if (vis[u]) continue;
vis[u] = true;
// vis数组用来判断是否更新
//参考dijsktra
for (int i = ; i <= n; i++)
{
int v = (u + a[i]) % a[];//目前的需要更新的点
if (dis[u] + a[i] < dis[v])
{
dis[v] = dis[u] + a[i];//判断是否需要更新
pre[v] = i; //这个正在更新的点边权(a[j]) 的编号 J
q.push((node){v, dis[v]});//加入堆
}
}
}
}
int main() {
//freopen("equip.in", "r", stdin);
//freopen("equip.out", "w", stdout);
scanf("%d%d%d", &n, &m, &K);
for (int i = ; i <= n; i++) a[i] = getin();
dijkstra();
for (int i = ; i <= m; i++) {
ll x = getin();
if (x < dis[x % a[]]) printf("No\n");//判断无法被兑换的情况
else {
printf("Yes");
if (K == ) {
for (int j = ; j <= n; j++) sum[j] = ;
//sum[j] 表示的是每种碎片需要的数量
sum[] += (x - dis[x % a[]]) / a[];
//需要的 a[1] 碎片数量
// x-dis[x%a[1]] 是刨掉a[1]以外碎片使用的总价值
while (x % a[])
{
sum[pre[x % a[]]]++;//这个位置的碎片数++;
x = ((x - a[pre[x % a[]]]) % a[] + a[]) % a[];
//把当前的碎片和a[1]刨掉剩下的需要价值(那么长主要是保证其精度不要在意)
}
for (int j = ; j <= n; j++) printf(" %I64d", sum[j]);
//简简单单的输出,不用的话就是输出0 (反正任意一种情况都能过2333)
}
printf("\n");
}
}
return ;//防我自己抄袭
}
好的就是这些,由于目前没找着原题,所以无法评测,看不懂可以找我
ありがとうございます
【一道来自老师的题的题解】equip——奇妙的最短路的更多相关文章
- CodeM美团点评编程大赛复赛 做题感悟&题解
[T1] [简要题意] 长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...
- 【BZOJ1036】[ZJOI2008] 树的统计Count(一道可怕的模板题:树剖+线段树)
点此看题面 题解 这真的只是一道模板题:一个树链剖分套上一个线段树(令我窒息的组合). 既然是模板题,那就直接上代码吧. 代码 #include<bits/stdc++.h> #defin ...
- HDU100题简要题解(2060~2069)
这十题感觉是100题内相对较为麻烦的,有点搞我心态... HDU2060 Snooker 题目链接 Problem Description background: Philip likes to pl ...
- HDU100题简要题解(2050~2059)
HDU2050 折线分割平面 题目链接 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以 ...
- 洛谷P2918 [USACO08NOV]买干草(一道完全背包模板题)
题目链接 很明显的一道完全背包板子题,做法也很简单,就是要注意 这里你可以买比所需多的干草,只要达到数量就行了 状态转移方程:dp[j]=min(dp[j],dp[j-m[i]]+c[i]) 代码如下 ...
- 又一道区间DP的题 -- P3146 [USACO16OPEN]248
https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ...
- [真题] 一道 vsftp 运维题
一道 vsftp 运维题 一.前言 在 V 站上凑巧看到了好友发的求助帖,五天时间一个理他的都没有.哈哈哈~ 废话不多说,我们来试试. 二.题目 这里我们假设存在这样的场景: 网络内有普通用户 ade ...
- QDUOJ 一道简单的数据结构题 栈的使用(括号配对)
一道简单的数据结构题 发布时间: 2017年6月3日 18:46 最后更新: 2017年6月3日 18:51 时间限制: 1000ms 内存限制: 128M 描述 如果插入“+”和“1”到 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
随机推荐
- 【一起学源码-微服务】Nexflix Eureka 源码二:EurekaServer启动之配置文件加载以及面向接口的配置项读取
前言 上篇文章已经介绍了 为何要读netflix eureka源码了,这里就不再概述,下面开始正式源码解读的内容. 如若转载 请标明来源:一枝花算不算浪漫 代码总览 还记得上文中,我们通过web.xm ...
- Another Filling the Grid
E. Another Filling the Grid 参考:Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 容斥这个东 ...
- triplet
询问次数<=min(2*n,n+35) 一种类似hash的交互题 部分分n=5,限制10次 发现都问出来可以通过次数和大小确定所有的值和对应位置! n比较大 发现(X1,X2,i)能确定一些情况 ...
- 【译】OkHttp3 拦截器(Interceptor)
一,OkHttp 拦截器介绍(译自官方文档) 官方文档:https://github.com/square/okhttp/wiki/Interceptors 拦截器是 OkHttp 提供的对 Http ...
- PHP ob_get_level嵌套输出缓冲
PHP的输出缓存是可以嵌套的.用ob_get_level()就可以输出嵌套级别. 测试发现在cli和浏览器下输出结果不一样(PHP5.4). ob_level1.png手册说明如下: ob_get_l ...
- 关于colab的一些技巧
1.指定工作文件夹(运行可以相对路径!) # 指定当前的工作文件夹 import os # 此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上 os.chdir(&q ...
- ccf 201612-3 权限查询
ccf 201612-3 权限查询 解题思路: 建立一个二维矩阵存储权限和角色 还差30分emmm #include<iostream> #include<cstring> ...
- ExpectedConditions API
使用 public boolean isPresent(String xpath, int waitingTimeInSec) { try { WebDriverWait wait = new Web ...
- go之无缓冲channel(通道)和有缓冲channel(通道)
channel我们先来看一下通道的解释:channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度.chann ...
- golang mysql 如何设置最大连接数和最大空闲连接数
本文介绍golang 中连接MySQL时,如何设置最大连接数和最大空闲连接数. 关于最大连接数和最大空闲连接数,是定义在golang标准库中database/sql的. 文中例子连接MySQL用的SQ ...

