计数(数学题,思维技巧)

计数

Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Submit Status Practice SCU 2090

Description

给定空间里n个点,其中没有三点共线。每两个点之间都用红色或蓝色线段连接。如果一个三角形的三条边同色,则称这个三角形是单色三角形。给出红色线段的列表,求出单色三角形的总数。

Input

第一行测试数据的总数T。

对于每个测试数据。

第一行为点数n(3<=n<=1000).

第二行为红色线段的总数m(m<=250000).

接下来m行每行两个整数u和v,表示点u和点v之间的线段为红色线段。

Output

输出单色三角形的总数

Sample Input

1
6
9
1 2
2 3
2 5
1 4
1 6
3 4
4 5
5 6
3 6

Sample Output

2

//这题暴力三重循环也能过。。。数据较弱

328ms

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 int n,m;
 5 int ans;
 6 int bian[1005][1005];//0为蓝,1为红
 7
 8 int func(int u)
 9 {
10     int i,j;
11     int s1,s2,s3;
12     for (i=u+1;i<=n;i++)
13     {
14         if (i==u) continue;
15         s1=bian[u][i];
16         for (j=i+1;j<=n;j++)
17         {
18             if (j==u) continue;
19             s2=bian[i][j];
20             if (s2==s1)
21             {
22                 s3=bian[j][u];
23                 if (s2==s3)
24                 {
25                     ans++;
26                     //printf("%d %d %d\n",u,i,j);
27                 }
28             }
29         }
30     }
31 }
32
33 int main()
34 {
35     int T;
36     scanf("%d",&T);
37     while (T--)
38     {
39         scanf("%d",&n);
40         memset(bian,0,sizeof(bian));
41         scanf("%d",&m);
42         int i;
43         int u,v;
44         for (i=1;i<=m;i++)
45         {
46             scanf("%d%d",&u,&v);
47             bian[u][v]=bian[v][u]=1;
48         }
49
50         ans=0;
51         for (i=1;i<=n;i++)
52         {
53             func(i);
54         }
55         printf("%d\n",ans);
56     }
57     return 0;
58 }

//当然,必须上简便方法,方法是这样的,如果是 n 边形,看其中的一个点,如果有a个红边连着它,就有 n-1-a 的蓝边连着它。

a * (a-1-n) 的意思便是由这个点会组成多少不同颜色的三角形,将点遍历一遍,求出有多少不同颜色的三角形,关键在去重,不是除3,而是除2

因为要组成个三角形不但要连接每个点的两条边,还需要一个边,但是只有两种颜色,所以第三边肯定不是红就是蓝,所以每一个不同颜色的三角形被 2 个点重复计算了,所以除2

然后用组合公式 C(n,3) 减去就是答案

40ms

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 int dot[1005];
 5 int n,m;
 6
 7 int C(int a,int b)//  a!/(a-b)!/b!
 8 {
 9    return n*(n-1)*(n-2)/6;
10 }
11
12 int main()
13 {
14     int T;
15     scanf("%d",&T);
16     while (T--)
17     {
18         memset(dot,0,sizeof(dot));
19         scanf("%d",&n);
20         scanf("%d",&m);
21         int u,v;
22         for (int i=0;i<m;i++)
23         {
24             scanf("%d%d",&u,&v);
25             dot[u]++;
26             dot[v]++;
27         }
28         int Q=0;
29         for (int i=1;i<=n;i++)
30             Q+=(n-1-dot[i])*dot[i];
31
32         int ans=C(n,3)-Q/2;
33         printf("%d\n",ans);
34     }
35     return 0;
36 }

时间: 2024-10-23 03:45:13

计数(数学题,思维技巧)的相关文章

更快学习 JS 的 6 个简单思维技巧

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候. 很难找到学习的时间(有时候是动力). 一旦当你理解了一些东西的时候,却很容易再一次忘记. 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手. 幸运的是,这些挑战最终都可以被战胜.在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员. 1.不要让将来的决定阻止你进步 对于很多学习 JavaSc

更快学习 JavaScript 的 6 个思维技巧

我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候. 找不到时间(有时是动力)学习. 很容易忘记已经理解了的东西. 工具多又在不断变化,所以不知道从哪里开始. 幸运的是,这些拦路虎是可以被识别,并消灭的.在这篇文章中,我将介绍六个思维技巧来帮助你更快地学习JavaScript,并成为一个更快乐.更富有成效的程序员. 1.不要让未来的决策阻止你现在前进的方向 很多人学习JavaScript,问的第一个

更快学习 JavaScript 的 6 个思维技巧---分享

更快学习 JavaScript 的 6 个思维技巧 2015-10-10 全栈开发者中心 我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候. 找不到时间(有时是动力)学习. 很容易忘记已经理解了的东西. 工具多又在不断变化,所以不知道从哪里开始. 幸运的是,这些拦路虎是可以被识别,并消灭的.在这篇文章中,我将介绍六个思维技巧来帮助你更快地学习JavaScript,并成为一个更快乐.更富有成效的程序

帮助你更快学习JavaScript的六个思维技巧

? ? ? ? ? ? ? ? 当人们试图学习JavaScript或其他编程语言的时候,他们通常会遇到如下挑战. 一些概念让他们感到困惑,特别是如果之前学过其他类型的语言. 很难找到学习的时间(或者动力)去学习. 你很容易忘掉之前学到的东西. JavaScript工具太多并且经常更新,以至于很难找到学习的切入点. 幸运的是,这些难题最终能够被克服.在这篇文章,我将展示六个能够帮助你更快.更开心.更高效地学习JavaScript的六个思维技巧. 1   不要让未来的忧虑干扰你现在的学习 有些Jav

POJ 1852 Ants (思维技巧 + 贪心)

Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10639   Accepted: 4718 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it imm

看似数学题 (思维)

本文链接:https://blog.csdn.net/weixin_43880627/article/details/100567452        Description给定一个数组A,长度为N.给一个整数K,你需要找到满足如下条件数组B:1.数组长度也是N:2.数组中每个数字都是不超过K的正整数:3.存在两个正整数X和Y,使得A[i] * X == B[i] * Y 对所有1<=i<=N都成立.求出满足这样条件的数组的个数. Input第一行两个整数N和K.第二行N个整数,表示数组A.数

思维:思维

ylbtech-思维:思维 思维最初是人脑借助于语言对客观事物的概括和间接的反应过程.思维以感知为基础又超越感知的界限.通常意义上的思维,涉及所有的认知或智力活动.它探索与发现事物的内部本质联系和规律性,是认识过程的高级阶段 . 思维对事物的间接反映,是指它通过其他媒介作用认识客观事物,及借助于已有的知识和经验,已知的条件推测未知的事物.思维的概括性表现在它对一类事物非本质属性的摒弃和对其共同本质特征的反映. 随着研究的深入,人们发现,除了逻辑思维之外,还有形象思维.顿悟思维等等思维形式的存在.

汇道科技:web新手快速入门JavaScript的技巧

我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前:有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候.找不到时间(有时是动力)学习.很容易忘记已经理解了的东西.工具多又在不断变化,所以不知道从哪里开始.幸运的是,这些拦路虎是可以被识别,并消灭的.在这篇文章中,汇道科技将介绍六个思维技巧来帮助你更快地学习JavaScript,并成为一个更快乐.更富有成效的程序员. 1.不要让未来的决策阻止你现在前进的方向 很多人学习JavaScript,问的第一个问题

【阅读推荐】改变你思维模式的书

<你以为你以为的就是你以为的吗?2> <你以为你以为的就是你以为的吗?2>是思维大师朱立安 `巴吉尼继畅销书<你以为你以为的就是你以为的吗?>之后的又一部力作. 这部具有颠覆性与挑战性的作品揭露了热门论战中的8种思维陷阱,破解了那些看似有理,实则糟糕的谬误言论. <你以为你以为的就是你以为的吗?2>中标举了近百个精彩热点的实例,如"一只中了彩票的鸭子""用iPod的贫困儿童""我没有和莱温斯基发生性关系&qu