日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codeforces - 766B【三角形判断】

發布時間:2024/4/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces - 766B【三角形判断】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
codeforces - 766B【三角形判斷】

題解By: Jstyle
知識點一
?? ?要想三邊滿足構成三角形的條件有兩個
?? ?1、任意兩邊之和大于第三邊。
?? ?2、任意兩邊之差小于第三邊。
知識點二
?? ?假設三邊為 a, b, c 且滿足 a <= b <= c;那么只需要滿足 a+b > c即可;
?? ?證明:
?? ?任意兩邊之和大于第三邊:
?? ?因為 a <= b <= c, 則 a+c > b && b+c > a 是顯然的;
?? ?任意兩邊只差小于第三邊:
?? ?因為: a+b > c 所以: a > c-a && b < c-a;
?? ?那么我們只需要證明 b-a < c即可;
?? ?因為: b < c 所以 b-a < c-a < c即 b-a < c;
?? ?證畢。

此題解法:
?? ?有了以上假設解決這道題會非常容易。
?? ?這道題有個很樸素的做法就是我們去三重for循環枚舉三條邊是否滿足條件,但是超時也是顯然的。
?? ?基于知識點二我們可以有如下做法:
?? ?1、將給定的n條邊進行排序;
?? ?2、從大到小去判斷相鄰的三條邊是否有 a[i] < a[i-1]+a[i-2]的關系;
?? ?3、如果有就直接跳出循環并輸出"YES";否則繼續去執行2;
?? ?這樣我們只需要 (排序+一層循環遍歷) 就可以解決了,時間復雜度 O(n*logn);
?? ?
解法的合理性:
?? ?我們來證明一下這樣的可行性:
?? ?1、對于從大到小遍歷的 c 來言,要想找到兩個數 a+b > c,肯定a,b越大才越有可能成立。
?? ?2、那對于我們排序過后的數組而言,肯定是c往下相鄰的兩個數是最大的。即就是a[i-1],a[i-2];
?? ?3、如果對于當前的 a[i-2]+a[i-2] <= a[i];那么a[i]這條邊就可以從我們的遍歷數組中去掉了,
?? ??? 因為比a[i]小的最大的兩條邊都不滿足 a+b > c了,那么更小的邊更不會滿足,因此我們把a[i-1]繼續作為
?? ??? c這條邊繼續判斷。
?? ?? ?
希望大家能從這道理得到一些思考和啟發,此題代碼不長,但是需要基礎的思維。

代碼:

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define N 100005 5 using namespace std; 6 7 int n, a[N]; 8 int main() 9 { 10 while(scanf("%d", &n) != EOF){ 11 for(int i = 1; i <= n; ++ i) scanf("%d", &a[i]); 12 13 sort(a+1, a+n+1); 14 int ok = 0; 15 for(int i = n; i >= 3; --i){ 16 int x = a[i], y = a[i-1], z = a[i-2]; 17 if(y+z > x){ 18 ok = 1; 19 break; 20 } 21 } 22 printf(ok ? "YES\n" : "NO\n"); 23 } 24 return 0; 25 } View Code

?

posted on 2017-02-11 10:24 NWU_ACM 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/NWUACM/p/6388734.html

總結

以上是生活随笔為你收集整理的codeforces - 766B【三角形判断】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。