K能

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;
}
蒙的,我都不知是怎么过的;

你可能感兴趣的:(K能)