5 solutions

  • 2
    @ 2022-1-5 16:44:10

    若卡住 延长梯形两斜边构成一个大的等腰三角形采用相似三角形解题

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	double r,a,b,h;
    	cin>>r>>a>>b>>h;
    	if(b>=2*r){
    		cout<<"Drop";
    		return 0;
    	}else{
    		cout<<"Stuck"<<endl;
    		double x=(h*b)/(a-b);
    		double n=sqrt(h*h+(a-b)*(a-b)/4);
    		double p=(r*n)/((a-b)/2)-x;
    		printf("%0.10lf",p);
    	}
    }
    
    • 0
      @ 2024-2-20 13:48:59

      初中几何题,延长梯形斜边相交于一点,2 次三角形相似 + 勾股定理

      注意除法和整型-浮点型相互转换

      #include <bits/stdc++.h>
      using namespace std;
      
      #define DBG(x) cout << #x << "=" << x << endl
      
      void solve() {
        double ans = 0.0;
        int r, a, b, h;
      
        cin >> r >> a >> b >> h;
      
        if (b >= 2 * r) {
          printf("Drop\n");
        } else {
          double t = (1.0 * b * h) / (a - b);
          double b1 = (1.0 * b) / 2;
          double v1 = pow(t, 2) + pow(b1, 2);
          ans = (1.0 * r * sqrt(v1)) / b1 - t;
          printf("Stuck\n%.10f\n", ans);
        }
      }
      
      int main() {
        solve();
      
        return 0;
      }
      
      • 0
        @ 2023-10-27 23:14:18

        #include <stdio.h> #include <math.h> int main() { double r,a,b,h;//半径,上底,下底,等腰梯形的高度。 double m,e,d; scanf("%lf %lf %lf %lf",&r,&a,&b,&h); if(2r>b){ printf("Stuck\n");//m是衍生出来的等腰三角形的高 m=bh/(a-b); e=sqrt((mm)+bb/4); d=2re/b-m; printf("%.10lf",d); }else { printf("Drop"); } return 0; }

        • 0
          @ 2022-3-14 12:28:08

          我们延长梯形的边后可以得到一个等腰三角形。

          很显然,延长部分构成的小三角形与延长部分构成的大三角形相似(两条边成比例,且角相等)

          又因为相似三角形的边成比例:

          所以有:a / 2 :b / 2 = x+h : x =>只有一个未知数,可以求出 x 的值;

          根据 x 和 b / 2 的值 我们可以求出 延长部分小三角形的斜边值

          与上面求相似三角形同理可以知道 由半径做垂线形成的三角形 与延长部分的小三角形相似!

          所以有对应边成比例: r : b / 2 = (ans+x) : sqrt ( b * b / 4 + x * x) ;

          一个未知数即可求出 ans ! !!

          注意:粉色部分应该表示的是延长的小三角形的斜边 !

          #include <stdio.h>
          #include <algorithm>
          #include <math.h>
          #include <vector>
          #include <iostream>
          #include <string.h>
          #include <queue>
          using namespace std;
          double r,a,b,h;
          int main() {
              scanf("%lf%lf%lf%lf",&r,&a,&b,&h);
              double z=2*r;
              if(z<b)
                  printf("Drop\n");
              else {
                  double x=(b*h)/(a-b);
                  double k=(b*b/4)+(x*x);
                  double ans=(((2*r*sqrt(k))-x*b)/b);
                  printf("Stuck\n");
                  printf("%.10lf\n",ans);
              }
              return 0;
          }
          
          • @ 2022-4-1 20:53:54

            我靠,我根本 没想到这样 的 相似。我考虑 到 相似 三角形解决这道题了,而且 分为 很多情况。但是 真心的 没考虑到 这样的相似。这种 通式 的 推导 太牛了。

        • 0
          @ 2022-1-2 17:28:27
          #include<iostream>
          #include<cstdio>
          #include<cstdlib>
          #include<algorithm>
          #include<cmath>
          #include<cstring>
          
          using namespace std;
          
          int main(void)
          {
          	int a,b,h,r;
          	cin>>r>>a>>b>>h;
          	if(b>=2*r)
          	{
          		cout<<"Drop";
          		return 0;//如果....就结束
          	}
          	else {
          		double thir=sqrt(h*h+(a-b)*(a-b)*1.0/4);//“h”为直角边的三角形的第三边
          		double k1=thir/(a-b)*2;//相似比1
          		double len1=r*k1;//最大三角形的第三边
          		double k2=h*1.0/(a-b)*2;//相似比2
          		double len2=b*1.0/2*k2;//另一个三角形的一直角边
          		double len=len1-len2;//相减即为所求的“?”
          		
          		cout<<"Stuck"<<endl;
          		printf("%.10f",len);//题中要求保留10位小数
          	}
          	
          	
          	return 0;
           } 
          

          补全三角形,用相似三角形来做

          • 1

          Information

          ID
          127
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          4
          Tags
          # Submissions
          148
          Accepted
          67
          Uploaded By