題目描述
一天,小明坐在院子裡數星星,gardon就出了個難題給他,讓他數數天上的星星最多有多少個是在同一條直線上的。天上的星星太多了,小明馬上就看花了眼,你能寫個程式來幫他計算麼?
輸入
首先輸入乙個整數n(n<=300),接下來的n對數每對表示乙個星星的位置(星星的座標在-10000到10000之間,精確到小數點後1位)。沒有兩個星星會在同乙個位置。
輸出
乙個整數,表示一條直線上最多星星的數目。
樣例輸入
50 0
1 01 1
0 10.5 0.5
樣例輸出
3分析與解
我以維根斯坦的論述方式來分析:
對於斜率,點,以及線段來說:
1.兩點確定一條直線,直線具有斜率
2.斜率可以取0到無窮
3.斜率為無窮時說明直線與y軸平行或重合
4.斜率為無窮時說明斜率公式中分母為零
5.斜率為無窮時,其值具有相對性:2−0
0−0和
−1−0
0−
0\frac和\frac
0−02−0
和0−
0−1−
0乙個是正無窮,乙個是負無窮,但是其都是在一條直線上的(y軸)。
6.共線問題建立在三個點的基礎之上
7.我們不能通過一般的斜率公式是否相等來斷定三個點是否共線
8.可以通過乘式判斷3點共線
( y3
−y1)
(x2−
x1)−
(y2−
y1)(
x3−x
1)=0
(y3−y1)(x2−x1)−(y2−y1)(x3−x1)=0
(y3−y1
)(x2
−x1)
−(y2
−y1)
(x3−
x1)=
09.n個點,每乙個點都能和剩下n-1個點組成線段
10.當每個點都不共線時,n個點組成的不同直線的個數最多
11.a點和b點組成線段也意味著b點和a點組成線段
12.n個點組成最多不同直線個數為n∗(
n−1)
2\frac
2n∗(n−
1)
解題思路:
1.確定兩個點,找第三個點,看看他們是否共線,如果共線,當前標記陣列加一。
2.兩個確定點要取到所有不重複情況。
3.兩個點,那麼一定共線,所以我們只需要找有多少其餘的點在那條線上。然後再加上2就是所有在這條線上的點。
**
#include
#include
using namespace std;
struct star
;int
main()
int m=0;
int b[
100860];
for(
int i=
0;i++i)
} m++;}
}sort
(b,b+m);if
(n==
1) cout<<1;
else
if(n<=
0) cout<<0;
else cout<+2
;}
演算法提高 線段和點
演算法提高 線段和點 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個點和m個區間,點和區間的端點全部是整數,對於點a和區間 b,c 若a b且a c,稱點a滿足區間 b,c 求最小的點的子集,使得所有區間都被滿足。輸入格式 第一行兩個整數n m 以下n行 每行乙個整數,代表點的座標...
1 C 知識點 值型別和引用型別
一.什麼是值型別?什麼引用型別?1.值型別的值是儲存在棧上的。引用型別是存在堆上的。2.值型別變數宣告之後,不管是否已經分配記憶體,編譯器在堆上為其分配記憶體。3.引用型別宣告的時候,這時候只在棧中分配一小片記憶體用於容納乙個位址,此時候並沒有為其分配堆上的記憶體位址,當new乙個例項的時候,真正建...
關於C 和 dx9的一點總結(1)
事件1 最近遇到了很怪異的情況,用vs2010寫點程式,在debug版本下除錯,竟然發現watch裡只能看到一小部分變數。思前想後不能找到原因。最後發面工程屬性裡optimization赫然勾選了o3 優化。原來選擇優化模式竟然會使得debug失效。omg。事件2 最近發現用vs編寫 不再有方便的自...