• CF788C The Great Mixing(最短路)


    计算一些数的平均数是否等于一个数,可以等价于将这些数-这个数后计算和是否为0,这样我们可以避免除法运算

    为了避免负数,我们将初始可能值-n后+1000,这样只需要知道1000这个位置有没有达到即可。

    对于如何扩展,我们对于每个数,都枚举所有能够对他产生贡献的数,并且避免重复的数出现,这样的复杂度是平方的,显然可以接受。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int inf=0x3f3f3f3f;
    int dis[N];
    queue<int> q;
    int a[N];
    int st[N];
    int cnt[N];
    int main(){
        ios::sync_with_stdio(false);
        int n,k;
        cin>>n>>k;
        int i;
        for(i=1;i<=k;i++){
            cin>>a[i];
            cnt[a[i]-n+1000]++;
        }
        for(i=1000-n;i<=2000-n;i++)
            dis[i]=0x3f3f3f3f;
        for(i=1000-n;i<=1000-n+1000;i++){
            if(cnt[i]){
                dis[i]=1;
                q.push(i);
            }
        }
        while(q.size()){
            int tmp=q.front();
            q.pop();
            int i;
            for(i=0;i<=1000;i++){
                int sum=tmp+i-n;
                if(dis[i-n+1000]!=1||dis[sum]!=0x3f3f3f3f)
                    continue;
                dis[sum]=dis[tmp]+1;
                q.push(sum);
            }
        }
        if(dis[1000]==0x3f3f3f3f)
            cout<<-1<<endl;
        else{
            cout<<dis[1000]<<endl;
        }
    }
    View Code
  • 相关阅读:
    编写程序,验证string是ipV4地址
    TCP三次握手和四次挥手
    链表和数组的区别
    cookie和session的区别
    GET和POST的区别
    TCP和UDP的区别
    java HashMap和Hashtable的区别
    java 堆和栈的区别
    最小栈的实现
    关于几个位运算的算法分析
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13795915.html
Copyright © 2020-2023  润新知