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

 

posted @ 2020-10-10 23:41  朝暮不思  阅读(128)  评论(1编辑  收藏  举报