N-37.愛麗絲拼三角形
阿新 • • 發佈:2022-04-15
題目背景:
愛麗絲想要學幾何,可是她對數學是一臉懵逼。這不,某天幾何老師在黑板上出了這樣一道題:給定一個長度為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;}