UVa 11401 11401 - Triangle Counting

题目是给一个n,输出1到n中任取三个不重复数能够组成三角形的个数

到现在还是不相信我做出来了。。。

我先用三重循环跑,代码如下:


for(int i=2; i<=n; ++i){
            for(int j=i+1; j<=n; ++j){
                for(int k=i+j-1; k>j; --k){
                    if(i+j>k && k<=n){
                        cout << "i = " << i << "\t";
                        cout << "j = " << j << "\t";
                        cout << "k = " << k << endl;
                        count++;
                    }
                }
            }
        }

然后运行程序通过输入的n与得到的结果找规律。。。结果就找到规律了 尴尬

对应结果如下:

3	0
4	1	0+1×1
5	3	1+1×2
6	7	3+2×2
7	13	7+2×3
8	22	13+3×3
9	34	22+3×4
10	50	34+4×4
11	70	50+4×5
12	95	70+5×5
13	125	95+5*6
14	161 125+6*6

会发现

如果n为偶数

a[i] = a[i-1]+(n-2)*(n-2)/4

如果n位奇数

a[i] = a[i-1]+(n-1)*(n-3)/4

所以如果n为偶数

a[n] = 0+1*1+1*2+2*2+2*3+...+((n-2)/2)*((n-2)/2) = 1*3+2*5+3*7+...+((n-2)/2)*((n-2)/2)

n为奇数

a[n] = 0+1*1+1*2+2*2+2*3+...+((n-1)/2)*((n-3)/2)=1*3+2*5+3*7+...+((n-1)/2)*((n-3)/2)

不妨另b[i] = i*(2*i+1);

则上面两式对应为:

a[n] = sum{ b[i] }+((n-2)/2)*((n-2)/2) 其中(1<= i <=(n-4)/2)

a[n] = sum{ b[i] }其中(1<= i <=(n-3)/2)


所以最后的代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 1000010
#define ll long long
using namespace std;
ll a[MAXN];
ll f(ll n){
    return n*(n+1)*(2*n+1)/3+n*(n+1)/2;
}
int main(void){
    ll n;
    int ans = 0;

    while(cin >> n, n>2){
        
        ll ans = 0;
        if(n % 2){
            ans = f((n-3)/2);
        }
        else {
            ans = f((n-4)/2)+((n-2)/2)*((n-2)/2);
        }
        
        /*
        for(int i=2; i<=n; ++i){
            for(int j=i+1; j<=n; ++j){
                for(int k=i+j-1; k>j; --k){
                    if(i+j>k && k<=n){
                        cout << "i = " << i << "\t";
                        cout << "j = " << j << "\t";
                        cout << "k = " << k << endl;
                        count++;
                    }
                }
            }
        }
        */
        cout << ans << endl;

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值