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;}