習題:The Great Mixing(bfs)
阿新 • • 發佈:2020-07-27
題目
思路
考慮到平均數為n
即每一個數減去n之後,選出的數的平均數為0,即選出的數的求和為0
之後用bfs來暴力求解即可
這裡主要考慮到搜尋到的濃度實際上是隻能在\(-1000到1000\)之間的,
總時間複雜度即為\(O(n^2)\)
如果你和筆者一樣不想卡細節,你也可以用map,時間複雜度為\(O(n^2*log_n)\)
程式碼
#include<iostream> #include<queue> #include<map> using namespace std; struct node { int val; int step; }; int n,k; map<int,bool> f,used; queue<node> q; int main() { ios::sync_with_stdio(false); cin>>n>>k; for(int i=1,u;i<=k;i++) { cin>>u; u-=n; if(used[u]==0) used[u]=1; if(f[u]==0) f[u]=1; } int tot=0; for(map<int,bool>::iterator it=used.begin();it!=used.end();it++) q.push((node){(*it).first,(*it).second}); while(!q.empty()) { node t=q.front(); q.pop(); if(t.val==0) { cout<<t.step; return 0; } for(map<int,bool>::iterator it=used.begin();it!=used.end();it++) { if(f[(*it).first+t.val]==0&&-1000<=(*it).first+t.val&&(*it).first+t.val<=1000) { f[(*it).first+t.val]=1; q.push((node){(*it).first+t.val,t.step+1}); } } } cout<<"-1"; return 0; }