cly很喜歡三角形,有一天他遇到了一道和三角形有關的題,但是這道題他簡單了,他懶得做,於是交給了你。
給定乙個陣列,每次詢問乙個子區間,如果能從這個子區間挑出三個數組成三角形輸出clynb,否者輸出clycdd。
第一行給出陣列大小n,查詢次數q (1<=m,q<=1e5)
接下來一行輸入n個數,表示a[i] (1<=a[i]<=1e9)
接下來q行,每行輸入兩個數l,r,代表乙個子區間 (1<=l,r<=n)
對於每個詢問輸出clynb或者clycdd
5 32 1 4 3 5
1 21 3
3 5clycdd
clycdd
clynb
看了題之後的第一反應是分這麼幾步。
1:判斷l—r區域內是否有大於等於三個數字,沒有就輸出clycdd。
2:把資料sort一遍從小到大排序。
3:從第乙個到第n-2個開始遍歷,判斷a[i]+a[i+1]>a[i+2]是否成立,成立就輸出clynb,全不成立就輸出clycdd。
4:提交,超時,卒…
賽後看了題解才明白,我們都知道(除了我)斐波那契數列遞推式是a[i]+a[i+1]=a[i+2],第44項為七億多,第45項就十億多了了。題目中
如果這個數列不滿足形成三角形的條件不能形成三角形的條件是a[i]+a[i+1]<=a[i+2],我們就讓a[i]+a[i+1]=a[i+2],這樣就會形成斐波那契數列。然後根據題目中a[i]的範圍在1e9之內我們可以推出:從第45項開始知數列不滿足a[i]=a[i-1]+a[i-2],此時必能形成三角形。於是我們給題目優化一下,當l—r的長度大於45時,就一定是clynb,這樣一來就能少判斷好多資料,時間上也不會超辣~
#include
using namespace std;
#define qc std::ios::sync_with_stdio(0);
const
int n =
1e5+10;
long
long a[n]
;long
long b[n]
;int
main()
while
(q--
)else
sort
(b, b + len)
;int flag =0;
for(
int i =
0; i < len -
2; i++)}
if(flag ==0)
printf
("clycdd\n");
}}return0;
}
三角形問題
問題及 檔名稱 main.cpp 作 者 李磊濤 版 本 號 v1.0 問題描述 輸出三角形的周長和面積。輸入描述 無。程式輸出 輸出三角形的周長和面積。include includeusing namespace std class void setabc double x,double y,do...
數字三角形問題
數字三角形問題 標籤 動態規劃 雜談分類 演算法設計 34 5 11 9 8 15 21 13 4 這是乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 200 三角形中的數字為整數0,1,99 輸入格式 第...
列印三角形問題
列印如下所示等腰三角形 方法1 f用來處理空格與 交替 n為行數,k為 出現的數目 public static void outtri int n else system.out.println 方法2 f用來處理空格與 交替 n為行數,k為 最大的位置 public static void out...