uestc1633

题意

给你一个大小为 \(n\) 的集合 \(S\) ,集合里有 \(n\) 个互不相同正整数,有 \(q\) 个询问,每次询问是否能选择 \(S\) 中的一些数字 ( 同一个数字可以选择多次,也可以任何数字都不选),使它们相加的和为 \(m\) 。

分析

这种题型 竟然 可以套用最短路的模型。

如果 \(k\) 在集合中,那么如果 \(a\) 是合法的和的方案,那么 \(a + k\) 一定是合法的。

那么我们只要求出 \(\% k\) 后得到 \([0, k - 1]\) 这些数的最小的和( \(d\) 数组)。那么判断是否可以组成 \(m\) ,只需要 \(m >= d[m \% k]\) 。

主要就是维护一个小的先出的优先队列 ,所以先出来的值 ( 假设是 \(x\) ) \(\% k\) 的相同的余数中一定是最小的,这个时候就要标记 \(vis[x \% k] = 1\) ,所有后面出来的值 \(y\) ,如果 \(vis[y \% k]\) 已经标记过 ( 假设就是前面的 \(x\) 标记的 ) ,可以直接跳过,因为 \(x \% k == y \% k\) ,且 \(x < y\) ,前面 \(x\) 出队列后已经更新了其它的可能出现的余数,在拿 \(y\) 去更新就没必要了。

code

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e3 + 10;
const int INF = 1e9 + 7;
int n, a[MAXN];
int d[50005];
int vis[50005];
void dij(int w) {
priority_queue<int, vector<int>, greater<int> > q;
fill(d, d + w, INF);
q.push(0);
d[0] = 0;
while(!q.empty()) {
int now = q.top(); q.pop();
if(vis[now % w]) continue;
vis[now % w] = 1;
for(int i = 0; i < n; i++) {
int dist = now + a[i];
if(dist < d[dist % w]) {
d[dist % w] = dist;
q.push(dist);
}
}
}
}
int main() {
scanf("%d", &n);
int w = INF;
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
w = min(w, a[i]);
}
dij(w);
int q;
scanf("%d", &q);
while(q--) {
int m;
scanf("%d", &m);
puts(m >= d[m % w] ? "YES" : "NO");
}
return 0;
}

uestc1633的更多相关文章

随机推荐

  1. Topcoder SRM579 1000pts

    石头剪刀布QAQ 一看是个很油的概率dp 首先一看你很快能得出状态的表示F[i][r][p][s] 然后只要考虑r,p,s出现的次数来进行概率dp就好了 具体实现的时候细节很多(少) 如果预处理一下组 ...

  2. BZOJ day2_plus

    大半夜的刷b站,好爽啊... 突破十九题 1008105110591088117911911192143218761951196821402242243824562463276128184720

  3. [SDOI2011]消防/[NOIP2007] 树网的核

    消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家最兴旺的 ...

  4. 安卓topbar编码实战

    1.先在res->value下新建attrs.xml文件 <?xml version="1.0" encoding="utf-8"?> < ...

  5. egrep对于conf文件中去掉#注释,排除无用项

    [root@localhost conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf dd

  6. C# using一般用法 (转)

    using一般有着以下几种用法: 1.直接引入命名空间 a.using System ,这个是最常用的,就是using+命名空间,这样就可以直接使用命名空间中的类型,而免去了使用详细的命名空间 b.使 ...

  7. [目前未找到题目]扩展KMP模板

    procedure build_next; begin lena:=length(a);lenb:=length(b); next[]:=lenb;next[]:=lenb-; to lenb- ] ...

  8. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  9. apache工作模式

    查看当前apache的工作模式 apachectl -l prefork模式 <IfModule prefork.c>StartServers 5MinSpareServers 5MaxS ...

  10. Chocolatey 使用

    最近空了下来不干点什么就感觉脑袋热,可是出过的问题挖过的坑还是要自己去解决. 一直网络不好安装choco一直都是报错,今天又建立了chocolatey 在windows上来用,网络问题解决了,类似于m ...