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; } }
没有人不辛苦,只有人不喊疼