TOJ--3456--数学题
這題 做出來真的好爽啊... it is cool? although it is easy
雖然 已經是大概1 2點的事了 我拖到現在才寫是因為------lol 終于贏一把了 ---
先貼下題目:
touch me
嗯? 我一開始 用的是 3重for 我以為32767的數據量 是很小的....?? 結果 TLE。。
OK 那么 我們只能換種方法了? 看它里面的關系
假如 現在告訴你三角形的周長是 L 有個很重要又很基礎的定理 ---? 任意兩條邊之和大于第三邊
你知道一個固定周長的三角形 最長邊最短是在什么時候嗎?? 那就是----? 等邊三角形的時候 即 L/3 的時候
那么最大的時候呢?? 自然是L/2 的時候? 這里我的( L/2 )是不嚴密的? 沒有考慮 L的 奇偶性..
然后 我一開始的問題 就是出在這里了
因為當L為偶數的時候 L/2最長邊 與 剩余的2邊之和L/2 是相同的 這應該是排除的
當L為奇數的時候 L/2最長邊 小于 剩余的2邊之和(L/2+1) 這是成立的
這邊 我們可以進行一個小處理之后就不用 把奇偶性分開考慮? 假設 x 是最長邊 那么x的范圍就是
x -> L/3 ~ (L+1)/2?? 或 L/3 ~ (L-1)/2 第一個是<? 第二個是<= 我個人還是喜歡第一種~
現在 我們已經完成了對于最長邊的取值范圍的剪枝
然后就是相對應的? 當最長邊取值為X時 剩余2條邊的取值可能組合方案數 設剩余總和為y? cnt為組合數
假設y為8 那么它有(1,7) (2,6),(3,5),(4,4)這4種可能- 設為z
但并不是直接加上就好 因為要考慮邊的最大值問題與等邊三角形問題
有一點 要知道 對于一個y 拆成2個正整數之和的方案是 y/2
那么z應該怎么考慮呢?
z-(y-x-1) 這里 我不知道怎么解釋了?? 因為我當時是 寫了幾個式子 觀察出來的-----但感覺 就是那么回事? 可是 我解釋不了啊 =-=
?
啰嗦了好多沒用的話~ 上 code
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n; 7 int cnt; 8 while( ~scanf("%d",&n) ) 9 { 10 cnt = 0; 11 for( int i = n/3+1 ; i<(n+1)/2 ; i++ ) 12 { 13 int j = n-i; 14 cnt = cnt + j/2 - (j-i-1); 15 } 16 printf( "%d\n",cnt ); 17 } 18 return 0; 19 }View Code
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/radical/p/3791241.html
總結
以上是生活随笔為你收集整理的TOJ--3456--数学题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php empty()和isset()的
- 下一篇: Perl时间处理函数