给你一个长度,求以这个长度为周长的整数三角形个数为多少,如果非等腰则个数加一
分类,等腰与非等腰,水题一个,就是边界处理需要注意
代码:
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 int big(int a, int b)///return x bigger than a * 1.0 / b 5 { 6 return a / b + 1; 7 } 8 int small(int a, int b)///return x smaller than a * 1.0 / b 9 { 10 if(a % b == 0) return a / b - 1; 11 else return a / b; 12 } 13 int hasone(int n) 14 { 15 int num = 0; 16 for(int i = big(n, 3); i <= small(n, 2); i++) 17 { 18 num += small(n-i, 2) - big(n-2*i, 1) + 1; 19 } 20 21 return num*2; 22 } 23 int hastwo(int n) 24 { 25 return small(n, 2) - big(n, 4) + 1; 26 } 27 int solve(int x) 28 { 29 return hastwo(x) + hasone(x); 30 } 31 32 int main() 33 { 34 int n; 35 cin >> n; 36 while(n--) 37 { 38 int a, b; 39 cin >> a >> b; 40 cout << a << " " << solve(b) << endl; 41 } 42 return 0; 43 }
关于这一题需要说的有两点:
1.英文读题能力,旁边有着一本字典也无法读出这道题的意思,哪怕用了谷歌翻译也不知道意思,最后还是看的博客才知道他在讲什么。
2.边界处理,在看别人的代码时候发现有一个细节用的非常好
for(int i = (m+2)/3; i < (m+1) / 2; i++),这就是我的big和small函数。