UVALive 5846

来源:互联网 发布:淘宝自定义页面 编辑:程序博客网 时间:2024/06/07 14:40

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

首先是题目大意 

就是有一个多边形   每个顶点上面有一个灯   每两个灯之间有一条光线   光线有两种颜色  红色和蓝色  分别用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;    }}


0 0
原创粉丝点击