N-37.爱丽丝拼三角形

题目背景:

爱丽丝想要学几何,可是她对数学是一脸懵逼。这不,某天几何老师在黑板上出了这样一道题:给定一个长度为n的木棍,将其切割成长度为正整数a,b,c(a<=b<=c)的三段,问有多少种切割方案,使得切下来的三段可以拼成一个三角形,等腰三角形以及直角三角形,同时,三角形的三条边均要严格处于[l,r]这个区间。几何老师叫了正在做梦的爱丽丝上来回答这道题,这时她想要请你编写一个程序解决这个问题,让她免受老师的批评。

输入格式:

第一行一个整数T,代表数据组数。

此后T行每行三个正整数n,l,r,表示木棍的长度为n,三角形三条边均位于[l,r]这个区间。

输出格式:

T行,每行三个整数t1,t2,t3,分别表示满足条件的三角形的个数,等腰三角形的个数,直角三角形的个数。输出以换行符结尾。

样例输入1:

1

10 3 7

样例输出1:

1 1 0

数据范围:

1<=T<=10, 1<=n<=300, 1<=l,r<=100, r<=n

数据量不大,我们直接二重循环遍历两条边,进行判断即可。
为了不重复定义,我们设 i <= j <= n-i-j

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <math.h> 
int t, n, l, r;  
void solve () {
	int cnt = 0, cnt1 = 0, cnt2 = 0;  // 分别表示三角形个数,等腰三角形个数,直角三角形个数
        int n, l, r;  
        scanf("%d%d%d",&n,&l,&r);  
        for (int i = l; i <= r; i++) {  // 第一条边
            for (int j = i; j <= r; j++){  // 第二条边
                int k = n - i - j;  // 第三条边
                if (k > r || k < j || i + j <= k) continue; // k的范围限制和不能构成三角形的情况   
                cnt++;  
                if (i == j || i == k || j == k) cnt1++;  // 等腰
                if( i * i + j * j == k * k) cnt2++;  // 直角
            }  
        }  
    printf("%d %d %d\n",cnt,cnt1,cnt2);   
    return;
}
int main () {   
    scanf("%d",&t);  
    while (t--) solve ();
return 0;} 



posted @ 2022-04-15 18:02  misasteria  阅读(142)  评论(0编辑  收藏  举报