UVALive 5846

开始没想到这种方法  很蠢的超时了好几次   最后被学长提醒  才想到原来还可以这么做 

首先是题目大意 

就是有一个多边形   每个顶点上面有一个灯   每两个灯之间有一条光线   光线有两种颜色  红色和蓝色  分别用0 1表示  输入任意两点之间光线的颜色  问有没有三个点之间的线是同一个颜色  

接下来说一下思路   首先题目给的范围是1000个点  数据不大  但是纯纯的暴力枚举肯定会超  所以要变换一个思维进行暴力   既然找三条边颜色一样的很费劲  那就找三条边不全都一样的三角形   再用总的三角形个数减去不符合条件的三角形  就是答案了  首先在输入的时候  记录每个点连出去的边的颜色  一共只有两种颜色  记录起来比较方便   之后走一遍for循环  遍历1000个点  用两种边的个数相乘  这样构成的三角形  一定不是三边同色的  最后一减就是答案了  代码不是很复杂

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int an[1010][1010], a[1010], b[1010];
int main()
{
    int t;
    cin >> t;
    while(t--){
        int n;
        memset(an, 0, sizeof(an));
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        cin >> n;
        for(int i = 0; i < n; i++){
            for(int j = i+1; j < n; j++){
                cin >> an[i][j];
                if(an[i][j] == 0){
                    a[i]++;
                    a[j]++;
                }
                else {
                    b[i]++;
                    b[j]++;
                }
            }
        }
        int ans = 0;
        for(int i = 0 ; i < n; i++){
            ans += a[i]*b[i];
        }
        cout << n*(n-1)*(n-2)/6 - ans/2 <<endl;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值