zoukankan      html  css  js  c++  java
  • UESTC 1634 去年春恨却来时,落花人独立,微雨燕双飞

    题意:给你n个数(n<2000)q(q<10000)个询问s,求n个数是否能取任意个数相加得到s

    题解:一开始以为是数论写半天。。。可以把这些数分类,分成a[1]类,每一类的数可以由最小的数加上t个a[1]得到,

    初始得到的数只能是0,每个点到0的距离为无穷大,每次更新最短路,SPFA跑的更快一点

    #include <bits/stdc++.h>
    #define maxn 100010
    using namespace std;
    int dis[maxn], n, a[maxn];
    void bfs(int fi){
        memset(dis, 63, sizeof(dis));
        dis[0] = 0;
        queue<int >q;
        q.push(fi);
        while(!q.empty()){
            fi = q.front();
            q.pop();
            for(int i=1;i<n;i++){
                if(dis[fi]+a[i]<dis[(fi+a[i])%a[0]]){
                    dis[(fi+a[i])%a[0]] = dis[fi]+a[i];
                    //dir[(fi+a[i])%a[0]] = 1;
                    q.push((fi+a[i])%a[0]);
                }
            }
        }
    }
    int main()
    {
        int m, q;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        bfs(0);
        cin>>q;
        while(q--){
            cin>>m;
            cout<<((dis[(m)%a[0]]<=m)?"YES":"NO")<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Asp.Net Page学习
    [转]35岁前务必成功的12级跳
    正则表达式
    Logger实例程序
    【转】心里语言
    MVC学习
    Request类和Response类
    PipeandFilter模式
    请不要做浮躁的人[转]
    Bnumber [HDU 3652]
  • 原文地址:https://www.cnblogs.com/Noevon/p/7162662.html
Copyright © 2011-2022 走看看