自己太菜了。小声哔哔。。。。
这个题什么意思呢?
给你总长度,问你能够组成几个不一样的三角形,翻转过来算两种(看图你就明白了),等腰三角形或者等边三角形不参与翻转情况只能各自算一种。
比赛的时候这道题,读明白了,但,就是写不出来!!!!!!按照正常思路看到三角形,你应该想到:
三角形三边关系:两边之和大于第三边;两边之差小于第三边。纯数学问题了,现在给你了一个总长度,让你拆分成三部分。假设你先考虑等边三角形,n/3就是每条边的长度,其实你写循环的时候只需要到这个边界就可以了。再往后就重复了(不信你自己手动写一下,我就写了。。。然后我信了)。接下来我们就要写数学公式啦~注意啦哈。
1. x+y+z=n 假设三条边为x,y,z
2. 0<=z-y<x,假设 t=z-y 吧,也就是 0<=t<x 两边之和小于第三边且大于等于0
通常来说,我们喜欢消元法,减少变量,来简化运算,这里也是同样呀。通过对2号式子进行变形,我们可以得到3. z=y+t。我们把三号式子代入一号式子中可以得到这个:
y=(n-x-t)/2我们得到第二条边,同时,其中的t是一个范围,所以得到的y也是一个范围。我们把t的范围带到y中:(n - 2x) / 2 < y <= (n - x) / 2 通过进一步拆分可以得到
n / 2 - x + 1 <= y <= (n - x) / 2

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<math.h>
using namespace std;
int p;
int n;
int main()
{
cin>>p;
while(p--)
{
int ymin,ymax;
int sum=0;
int l;
cin>>l>>n;
cout<<l<<" ";
for(int x=1;x<=n/3;x++)
{
ymin=max((n/2-x+1),x);
ymax=(n-x)/2;
sum+=(ymax-ymin+1)*2;
if(x==ymin)
sum--;
if(x!=ymax&&ymax==n-x-ymax)
sum--;
}
cout<<sum<<endl;
}
return 0;
}
相关文章:
-
2021-10-31
-
2021-12-23
-
2021-06-29
-
2021-06-25
-
2021-11-08
-
2021-11-28
-
2021-12-05
-
2022-02-16