杭电ACM 2058 总是Time Limit Exceeded,求高手指点迷津
发布网友
发布时间:2024-10-03 14:20
我来回答
共3个回答
热心网友
时间:2024-10-09 08:25
#include <stdio.h>
#include <math.h>
int main()
{
int n,m;
int l,i,a,b,s;
while (scanf("%d%d",&n,&m),n + m)
{
l = (int)sqrt(2 * m);
for (i = l; i >= 1; i--)
{
s = (2*m + i - i*i)/2;
if(s % i == 0)
{
a = s / i;
if(a > n) break;
printf("[%d,%d]\n",a,a + i - 1);
}
}
printf("\n");
}
return 0;
}
我做的时候也是缩小了他的范围来做的,然后根据一边算,给你看看代码
热心网友
时间:2024-10-09 08:26
给你看我的代码把。。
我的没超时。。
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,m,i,b,a;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
//(a+b)(b-a+1)==m;
for(i=sqrt(2*m);i>=1;i--)
{
if((2*m)%i==0)
{
//a+b==2*m/i;b-a+1=i;
if(((2*m)/i+i-1)%2==0)
{
b=(2*m/i+i-1)/2;
a=(2*m)/i-b;
if(a<=n&&b<=n&&a<=b)
cout<<"["<<a<<","<<b<<"]"<<endl;
}
}
}
cout<<endl;
}
return 0;
}
应该能看懂吧。
热心网友
时间:2024-10-09 08:32
你应该是两层for循环嵌套超时了,你换了三个但是时间复杂度都没有变,应该换种思路了