Google算法题 有限次询问下估算图的边数 Code jam Qualification Round 2022 Q5
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;
}

浙公网安备 33010602011771号