养鸡场
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;
}
#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;
}
为了明天所以选择坚定的执着今天。