K能
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
这是个什么问题呢?DP,贪心,数据结构,图论,数论还是计算几何?管他呢,反正胖巨巨都会,虽然胖巨巨走得早。
胖巨巨有一个长为n的棍子,他打算将这根棍子截成三段长度分别为a1,a2,a3的棍子,然后用这三根棍子围城一个三角形。由于胖巨巨是个
很(chu)严(nv)谨(zuo)的选手,他想让三根棍子的长度为整数,且三根棍子的长度分别在某个区间内,且a1<=a2<=a3。
现在胖巨巨想知道一共有多少种可行的方案。
输入
输入数据包含多组。对于每组数据:
第一行是一个整数n(n <= 20000)。
接下俩的三行,每行两个整数Li,Ri(1 <= Li <= Ri <= n)表示a1,a2,a3的取值范围。
输出
对于每组输入,输出一个整数代表可行的方案数。
示例输入
3 1 1 1 1 1 1 4 1 1 1 1 1 1
示例输出
1 0
提示
来源
zmx
示例程序
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
int solve(int x,int y)
{
if(x>y)
return 0;
else
return y+1-x;
}
int main()
{
int L_1,R_1,L_2,R_2,L_3,R_3,Len;
while(~scanf("%d",&Len))
{
scanf("%d%d%d%d%d%d",&L_1,&R_1,&L_2,&R_2,&L_3,&R_3);
if(Len/3<R_1)
R_1=Len/3;
if((Len+2)/3>L_3)
L_3=(Len+2)/3;
int sy,x_2,y_2,x_3,y_3;
int sum=0;
for(int i=L_1; i<=R_1; i++)
{
sy=Len-i;
x_2=L_2;
y_2=R_2;
x_3=L_3;
y_3=R_3;
if(y_2>sy/2)
y_2=sy/2;
if(x_3<(sy+1)/2)
x_3=(sy+1)/2;
if(x_2<i)
{
x_2=i;
}
if(y_3>(Len-1)/2)
y_3=(Len-1)/2;
if(x_2<(sy-(Len+1)/2)) //写成Len也可过;
{
x_2=sy-Len/2;
}
if(x_2>sy/2)
{
x_2=sy/2;
}
if(x_3<sy/2)
x_3=sy/2;
if(x_2<sy-y_3)
x_2=sy-y_3;
if(y_2>sy-x_3)
y_2=sy-x_3;
sum+=solve(x_2,y_2);
}
printf("%d\n",sum);
}
return 0;
}
蒙的,我都不知是怎么过的;