养鸡场

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;
}
posted @ 2013-09-18 10:46  forevermemory  阅读(199)  评论(0编辑  收藏  举报