zoukankan      html  css  js  c++  java
  • 【递推】【组合计数】UVA

    http://blog.csdn.net/highacm/article/details/8629173

    题目大意:计算从1,2,3,...,n中选出3个不同的整数,使得以它们为边长可以构成三角形的个数。

    思路:用一般的方法需要三重循环,时间复杂度为O(n^3),肯定超时,因此可用数学的方法对问题进行分析。设最大边长为x的三角形有c(x)个,另外两边长分别为y,z,则可得x-y<z<x;固定x枚举y,计算个数0+1+2+...+(x-2)=(x-1)(x-2)/2。上面的解包含了y=z的情况,而且其他情况算了两遍。而y=z的情况时y从x/2+1枚举到x-1为止有(x-1)/2个解,所以c(x)=((x-1)*(x-2)/2-(x-1)/2)/2。

    由以上分析可得,最大边长不超过n的三角形数目为f(n)=c(1)+c(2)+...+c(n)。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll f[1000010];
    int n;
    int main(){
    	for(int i=4;i<=1000000;++i){
    		f[i]=f[i-1]+((ll)(i-1)*(ll)(i-2)/2ll-(ll)((i-1)/2))/2ll;
    	}
    	while(1){
    		scanf("%d",&n);
    		if(n<3){
    			break;
    		}
    		cout<<f[n]<<endl;
    	}
    	return 0;
    }
  • 相关阅读:
    PHP chgrp() 函数
    PHP basename() 函数
    PHP user_error() 函数
    PHP trigger_error() 函数
    my.cnf需要改的参数
    WPF 使用 Direct2D1 画图入门
    win10 uwp 如何开始写 uwp 程序
    win10 uwp 如何开始写 uwp 程序
    C# 快速释放内存的大数组
    C# 快速释放内存的大数组
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6847826.html
Copyright © 2011-2022 走看看