Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21423
  • 博文数量: 12
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 11:17
文章分类

全部博文(12)

文章存档

2012年(12)

我的朋友
最近访客

分类: C/C++

2012-12-22 21:51:37

本题是求大于L的能整出(P-L)的树的罗列。(从大到小。)

这道题如果用单一顺序列举肯定会慢,因为数字越大,因数分布越稀,能得到因数的几率越小。

所以我的代码会TLE。  - -||

我的TLE代码。

点击(此处)折叠或打开

  1. //大于L的能整除(P-L)的数的罗列 //TLE


  2. #include <stdio.h>


  3. int main()
  4. {
  5.     int T,t;
  6.     int p,l,a,i;
  7.     scanf("%d",&T);
  8.     for(t=1;t<=T;t++)
  9.     {
  10.         scanf("%d%d",&p,&l);
  11.         if(l*2>=p)
  12.             printf("Case %d: impossible\n",t);
  13.         else
  14.         {
  15.             printf("Case %d: ",t);
  16.             a=p-l;
  17.             for(i=l+1;i<=a/2;i++)
  18.                 if(a%i==0)
  19.                     printf("%d ",i);
  20.             printf("%d\n",a);
  21.         }
  22.     }
  23.     return 0;
  24. }
能解决问题的代码。(善用C++容器。)


点击(此处)折叠或打开

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;

  6. int main() {
  7.     int test, cs, p, l, n, sz, rt;
  8.     vector< int > V;
  9.     scanf("%d", &test);
  10.     for(cs = 1; cs <= test; cs++) {
  11.         scanf("%d %d", &p, &l); n = p - l; rt = (int)sqrt(n);
  12.         V.clear();
  13.         for(p = 1; p <= rt; p++) {
  14.             if(n % p == 0) {
  15.                 if(p > l) V.push_back(p);
  16.                 if(p * p != n) {
  17.                     if(n / p > l) V.push_back(n / p);
  18.                 }
  19.             }
  20.         }
  21.         if(V.empty()) printf("Case %d: impossible\n", cs);
  22.         else {
  23.             sort(V.begin(), V.end()); sz = V.size();
  24.             printf("Case %d:", cs);
  25.             for(p = 0; p < sz; p++) printf(" %d", V[p]);
  26.             printf("\n");
  27.         }
  28.     }
  29.     return 0;
  30. }



阅读(381) | 评论(0) | 转发(0) |
0

上一篇:第四次训练题解题报告

下一篇:没有了

给主人留下些什么吧!~~