A.oval-and-rectangle
题目传送门:
题意:在长半轴为a,短半轴为b的椭圆内部,以y=c(0<=c<=b)截取内接矩形,问矩阵周长的期望。
分析:
然后除以b,得到:2*b+pi*a。
直接输出答案即可。要求直接舍弃小数点七位之后,需要先减去0.0000005,再保留6位输出。
1 #include2 using namespace std; 3 const double PI=acos(-1); 4 int main(){ 5 srand((unsigned)time(NULL)); 6 int t;double a,b;scanf("%d",&t); 7 while(t--){ 8 scanf("%lf%lf",&a,&b); 9 double ans=2*b+PI*a;10 ans-=0.0000005;11 printf("%.6lf\n",ans); 12 }13 return 0;14 }
I.Werewolf
题目传送门:
题意:有n个人,若干个狼或羊,每个人说一句话,羊必须说真话,狼可真可假。问一定有多少个羊,多少个狼。
分析:1.当所有人为狼时,一定成立。所以一定没有铁羊。
2.那么只需要判断铁狼即可。在一个环内,若A指认B为狼,B指认C为羊,C指认A为人,那么B一定为铁狼。此外,指认铁狼为人的人一定为铁狼。由此,可以dfs+标记找出铁狼。
1 #include2 using namespace std; 3 const int maxn=1e5+10; 4 struct point{ 5 int x,w; 6 }mp[maxn]; 7 int res,n; 8 int vis[maxn],k[maxn]; 9 void dfs(int x){10 vis[x]=-1;11 if (mp[x].w==1)12 vis[x]=mp[x].x;13 else{14 if (vis[mp[x].x]==0) dfs(mp[x].x);15 vis[x]=vis[mp[x].x];16 if (vis[x]==x || k[mp[x].x]==1){17 k[x]=1;res++;18 }19 }20 } 21 int main(){22 ios::sync_with_stdio(false);23 cin.tie(0);cout.tie(0);24 int t,x;25 string ss;26 cin >> t;27 while (t--){28 cin >> n;29 for (int i=1;i<=n;i++){30 cin >> x >> ss;31 if (ss[0]=='w'){32 mp[i].w=1;mp[i].x=x;33 }34 else{35 mp[i].w=0;mp[i].x=x;36 }37 }38 memset(vis,0,sizeof(vis));39 memset(k,0,sizeof(k));40 res=0;41 for (int i=1;i<=n;i++)42 if (!vis[i]) dfs(i);43 cout << 0 << " " << res << endl;44 }45 return 0;46 }
L.Pinball
题目传送门:
题意:一个小球从位置(x,y)处下落到斜率为b/a的斜坡上,问在斜坡上的碰撞次数。
分析:模拟。
1 #include2 using namespace std; 3 const double g=9.8; 4 double a,b,x,y; 5 int main(){ 6 ios::sync_with_stdio(false); 7 cin.tie(0);cout.tie(0); 8 int tt; 9 cin >> tt;10 while (tt--){11 cin >> a >> b >> x >> y;12 double sin=b/sqrt(a*a+b*b);13 double ax=g*sin;14 double h=y+b*x/a;15 double v0=sqrt(2*g*h);16 double t=v0/g;17 double v0x=v0*sin;18 double aa=x*x,bb=(x*b/a)*(x*b/a),s0=sqrt(aa+bb);19 int ans=0;20 while (s0>0){21 ans++;22 double ss=2*t*v0x+2*ax*t*t;23 s0=s0-ss;24 v0x=v0x+2*ax*t; //新的速度 25 }26 cout << ans << endl;27 }28 return 0;29 }