状況説明
この問題を自力では解けなくてネットで検索したところサンプルコードの解答例を見つけました。
解法のヒントの数式の部分を読んで自力で実装(総当り?)して入力例で正解だったので提出したところ、
TLE(Time Limit Exceeded)になりました。
その後詳しく見比べるとforループ文の終了回数の部分( i*i<=S と i<=s )が違いました。
試しに自作のコードのそこだけを修正して提出したところAC(Accepted)となりました。
(9秒以上掛かったものが1秒以下になりました)
//AC(正解) for(int i=1;i*i<=S;i++) //TLE(時間切れ) for(int i=1;i<=s;i++)
知りたいこと
結果と数式から計算量が大きく減ることは明らかなのですが、
何故forループ文の終了回数の部分( i<=s )を( i*i<=S )とするのかがよく分かりません。
数学的なことかアルゴリズム的な明快な理由があるはずだとは思うのですがアドバイス頂ければ助かります。
解答例
引用元:tobiasの日記
C++
1#include<iostream> 2#include<cmath> 3 4using namespace std; 5 6bool is_room(int S){ 7 8 for(int i=1;i*i<=S;i++) 9 if((S-i)%(2*i+1)==0)return true; 10 return false; 11} 12 13int main(void){ 14 15 int n,S,cnt=0; 16 17 cin >> n; 18 while(n--){ 19 cin >> S; 20 if(!is_room(S))cnt++; 21 } 22 cout << cnt << endl; 23 24 return 0; 25}
補足情報(開発環境など)
Win10
VSC1.47.3
C++14
gcc version 8.2.0 (Rev3, Built by MSYS2 project)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/09 21:15
2020/08/10 05:48