Google演算法題 有限次詢問下估算圖的邊數 Code jam Qualification Round 2022 Q5
阿新 • • 發佈:2022-04-04
https://codingcompetitions.withgoogle.com/codejam/round/0000000000876ff1/0000000000a45fc0#problem
1、利用總邊數=度數/2。
2、為了解決度數不平衡的問題,交替使用T(隨機傳送)和W(鄰接傳送)操作。
例如,少部分的點的度很高、但是大部分的點度數比較低,使用T操作很難前往度很高的點,但W操作則容易到達。
3、對T得到的樣本累計求得平均度數,對W的結果進行記錄(不進行累計的原因是W操作和T不是一致的)。
4、求和時,未知的用平均代替,已知的則用記錄值。
#include<bits/stdc++.h> using namespace std; void YD() { int N,K; cin>>N>>K; //vector<int> room(N+1,0); int cur,pass_num; long long sum_num=0,sum_degree=0; cin>>cur>>pass_num; //sum_num++; //sum_degree+=pass_num; unordered_map<int,int> index_degree; index_degree[cur]=pass_num; //room[cur]=pass_num; K/=2; while(K--) { int nxt=rand()%(N)+1; cout<<'T'<<' '<<nxt<<endl; cin>>cur>>pass_num; sum_num++; sum_degree+=pass_num; index_degree[cur]=pass_num; cout<<'W'<<endl; cin>>cur>>pass_num; //sum_num++; //sum_degree+=pass_num; index_degree[cur]=pass_num; } double average_degree_div2=double(sum_degree)/sum_num/2; double sum_degree_div2=0.; for(int i=1;i<=N;i++) { if(index_degree.count(i)) sum_degree_div2+=(double)index_degree[i]/2.; else sum_degree_div2+=average_degree_div2; } cout<<"E "<<(long long)(sum_degree_div2+0.5)<<endl; } int main() { int t; cin >> t; while (t--) { YD(); } return 0; }