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. Android webview “location.replace” 不起作用

    js解决方法: function locationReplace(url){ if(history.replaceState){ history.replaceState(null, document ...

  2. TypeConverter使用

    如下代码, <Window.Resources> <local:Human x:Key="human" Name="Tester1" Chil ...

  3. php函数-shuffle

    Shuffle()函数说明: -随机乱序现有数组并不保留键值: -shuffle()函数把数组中的元素按随机顺序重新排列,该函数为数组中的元素分配新的键名,已有键名将被删除. 语法说明: shuffl ...

  4. CSS垂直居中小结

    1.设置子元素: { ... position :absolute; margin:auto; top:; right:; bottom:; left:; } 2.设置子元素:(height必须是固定 ...

  5. jsp小知识点(2)

    一:自定义的函数库:在wh.tld中 <description>JSTL 1.1 functions library</description> <display-nam ...

  6. salt搭建lamp架构

    install_httpd: pkg.installed: - name: httpd httpd_running: service.running: - name: httpd - enable: ...

  7. 【BZOJ2049】【SDOI2008】洞穴勘测 [LCT]

    洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 辉辉热衷于洞穴勘测.某天,他按照地 ...

  8. 【洛谷 P2515】 [HAOI2010]软件安装 (缩点+树形背包)

    题目链接 看到代价和价值这两个关键词,肯定是首先要想到背包的. 但是图中并没有说这是棵树,所以先要\(Tarjan\)缩点,然后就是选课了,跑一遍树形背包就好了. 注意:缩点后应该是一个森林,应该用一 ...

  9. Ubuntu 下nginx 的卸载 与重新装

    由于本人把自己服务器的nginx 给玩坏了,不得已选择卸载重新安装,(先让我哭一会) 然后我把/usr/sbin/nginx  和/etc/nginx 和/usr/share/nginx 和 /usr ...

  10. Ubuntu破解开机密码

    使用Ubuntu和使用windows系列产品一样,会忘记开机密码.难道我们在忘记开机密码的时候就必须重装系统吗?当然不是了!既然在windows下面我们可以破解开机密码,那么在Ubuntu里面一样可行 ...