养鸡场

Problem Description

Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆全部用来围成一个三角形的养鸡场。为方便起见,养鸡场三条边的长度都为正整数。同时,他想让自己的养鸡场看起来更美观一些,要求三条边的长度分别在一个区间范围内。

现在,他想知道有多少种不同的方案使得围成的养鸡场满足要求?

Input

输入包含多组数据。输入数据第一行是一个正整数n,表示竹篱笆的长度。

在接下来三行中,第i行的两个正整数为xi,yi。表示三角形的第i条边的边长ai的范围在[xi,yi]内。

注意:Jason规定a1≤a2≤a3。

Output

输出一个整数,表示满足要求的不同方案数。

约定:

对于第二行至第四行,都有1≤xi≤yi ≤n

对于50%的数据n≤5000

对于100%的数据n≤200000

Sample Input

12 3 5 3 5 3 5

Sample Output

2
题意:给定三角形三边的范围,即三个区间,满足此三区间飞递减排列。求能组成多少个三角形
题解:因为区间的范围比较大。如果遍历两个变量必然超时,所以可先固定一条边的范围,然后根据条件得出另外两条变得范围,对于固定的那条边的点,另外两条边的区间的最小值即为当前满足条件的个数,依次相加即可!
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct lmx{
 int l;
 int r;
}lm[3];
int min(int a,int b)
{
 return a<b?a:b;
}
int max(int a,int b)
{
 return a>b?a:b;
}
int main()
{
 int i,n;
    while(scanf("%d",&n)!=EOF)
 {
  int sum=0;
  for(i=0;i<3;i++)
  {
   scanf("%d %d",&lm[i].l,&lm[i].r);
  }
  for(i=lm[1].l;i<=lm[1].r;i++)
  {
     int t1=lm[0].l,t2=lm[0].r;
     int v1=lm[2].l,v2=lm[2].r;
           t2=min(i,n-2*i);
     t1=max((n-2*i)/2+1,lm[0].l);
     v2=min(lm[2].r,i+t1-1);
     v1=max(i,lm[2].l);
     v1=max(v1,n-i-t2);
     v2=min(v2,n-i-t1);
     if(v2<v1||t2<t1) continue;
     int temp=min(t2-t1+1,v2-v1+1);
     if(temp>0) sum+=temp;
  }
  printf("%d\n",sum);
 }
 return 0;
}

转载于:https://www.cnblogs.com/ffhuguang/p/3328029.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值