• hdu--5019--开始参加bc了


    开始 有时间 晚上bc比赛也去做了

    这题 数据很大 虽然也注意到了 但还是一直tle

    ...

    一开始用set做 tle

    然后用vector做 tle

    才发现是应该先去求出gcd(x,y)这样可以减少很多遍历

     1 #include <iostream>
     2 #include <set>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 typedef long long LL;
     7 set<LL>s;
     8 
     9 void solve( LL x , LL y )
    10 {
    11     for( LL i = 1 ; i<=y/i && i<=x ; i++ )
    12     {
    13         if( x%i ==0 && y%i ==0 )
    14         {
    15             s.insert(i);
    16         }
    17         if( x%(y/i)==0 )
    18         {
    19             s.insert(y/i);
    20         }
    21     }
    22 }
    23 
    24 int main()
    25 {
    26     cin.sync_with_stdio(false);
    27     int t , cnt;
    28     LL x , y , k , temp , size;
    29     cin >> t;
    30     while( t-- )
    31     {
    32         s.clear();
    33         cnt = 0;
    34         set<LL>::iterator it;
    35         cin >> x >> y >> k;
    36         if( x>y )
    37         {
    38             swap(x,y);
    39         }
    40         solve(x,y);
    41         size = s.size();
    42         if( size<k )
    43             cout << -1 << endl;
    44         for( it = s.begin() ; it!=s.end() ; it++ )
    45         {
    46             ++ cnt;
    47             if( cnt==size-k+1 )
    48                 cout << *it << endl;
    49         }
    50     }
    51     return 0;
    52 }
    View Code
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <vector>
     4 using namespace std;
     5 
     6 typedef long long LL;
     7 vector<LL> ve_left;
     8 vector<LL> ve_right;
     9 
    10 void solve( LL x , LL y )
    11 {
    12     for( LL i = 1 ; i<=y/i && i<=x ; i++ )
    13     {
    14         if( y%i == 0 )
    15         {
    16             if( x%i==0 )
    17             {
    18                 ve_left.push_back(i);
    19             }
    20             if( y/i<=x && x%(y/i)==0 && i!=y/i )
    21             {
    22                 ve_right.push_back(y/i);
    23             }
    24         }
    25     }
    26 
    27 }
    28 
    29 int main()
    30 {
    31     cin.sync_with_stdio(false);
    32     int t;
    33     LL x , y , k , Size , Size1 , Size2;
    34     cin >> t;
    35     while(t--)
    36     {
    37         ve_left.clear();
    38         ve_right.clear();
    39         cin >> x >> y >> k;
    40         if( x>y )
    41             swap( x , y );
    42         solve( x , y );
    43         Size1 = ve_left.size();
    44         Size2 = ve_right.size();
    45         Size = Size1 + Size2;
    46         if( Size<k )
    47             cout << -1 << endl;
    48         else
    49         {
    50             if( Size2>=k )
    51             {
    52                 cout << ve_right[k-1] <<endl;
    53             }
    54             else
    55             {
    56                 k -= Size2;
    57                 cout << ve_left[Size1-k] << endl;
    58             }
    59         }
    60     }
    61     return 0;
    62 }
    View Code
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <vector>
     4 using namespace std;
     5 
     6 typedef long long LL;
     7 vector<LL> ve;
     8 
     9 LL gcd( LL x , LL y )
    10 {
    11     return y%x == 0 ? x : gcd( LL(y%x) , x );    
    12 }
    13 
    14 void solve( LL x , LL y , LL z )
    15 {
    16     for( LL i = 1 ; i<=z/i ; i++ )
    17     {
    18         if( z%i==0 )
    19         {
    20             ve.push_back(i);
    21             if( i!=z/i )
    22                 ve.push_back(z/i);        
    23         }
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     cin.sync_with_stdio(false);
    30     int t;
    31     LL x , y , k , z , Size;
    32     cin >> t;
    33     while(t--)
    34     {
    35         ve.clear();
    36         cin >> x >> y >> k;
    37         if( x>y )
    38             swap( x , y );
    39         z = gcd(x,y);
    40         solve( x , y , z );
    41         Size = ve.size();
    42         if( Size<k )
    43             cout << -1 << endl;
    44         else
    45         {
    46             sort( ve.begin() , ve.end() );
    47             cout << ve[Size-k] << endl; 
    48         }
    49     }
    50     return 0;
    51 }
    View Code

    将写得过程中的代码 全贴上来 给自己点 经验#24...

    today:

      用我一生 再换你十年天真无暇

      用我一生 再陪你十年颠沛流离

    just follow your heart
  • 相关阅读:
    delphi中使用webservice
    软件需求阅读笔记之三
    软件需求模式阅读笔记之二
    软件需求与分析课堂讨论一
    软件需求模式阅读笔记之一
    课后作业01
    2016秋季个人阅读计划
    个人总结
    软件工程概论作业
    人月神话阅读笔记之三
  • 原文地址:https://www.cnblogs.com/radical/p/3990024.html
Copyright © 2020-2023  润新知