自己太菜了。小声哔哔。。。。

这个题什么意思呢?

给你总长度,问你能够组成几个不一样的三角形,翻转过来算两种(看图你就明白了),等腰三角形或者等边三角形不参与翻转情况只能各自算一种

比赛的时候这道题,读明白了,但,就是写不出来!!!!!!按照正常思路看到三角形,你应该想到:

三角形三边关系:两边之和大于第三边两边之差小于第三边。纯数学问题了,现在给你了一个总长度,让你拆分成三部分。假设你先考虑等边三角形,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

ACM/ICPC 6174 Pen Counts

 

#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
猜你喜欢
  • 2022-12-23
  • 2021-07-19
  • 2021-09-06
  • 2021-09-19
  • 2021-10-03
  • 2021-07-19
相关资源
相似解决方案