loj 1109

一道题想了老半天,结果还是TLE了

TLE:

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int compare(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int t,n,i,a[1001],b[1001];
int j;
cin>>t;
int T=1;
while(t--)
{
cin>>n;
memset(a,0,sizeof(a));
//memset(b,0,sizeof(b));
for(i=1;i<=1000;i++)
{
for(j=1;j<=i;j++)
{
if(i%j==0)a[i]++;//a[i]用来看记录i有a[i]个除数;
}
b[i]=a[i];//保存未排序前的a[i]的数据;
}
qsort(a+1,1000,sizeof(int ),compare);
cout<<"Case "<<T++<<": ";
int l=1;
int k=a[n];//记录a[n]的除数个数是k;
for(i=n-1;i>=1;i--)
{
if(a[i]==k)l++;
else break;
}//用来计算这个a[n]是k中的第l个;
for(i=1000;i>=1;i--)
{
if(b[i]==k)
{
l--;
if(l==0)break;
}
}//用来求出这个第l个所对应的原始数据;
cout<<i<<endl;
}
return 0;
}

最终在楼长的指导下,了解了结构体二级排序,AC了

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

struct num
{
int x;
int y;
}s[1004];
int cmp(num a,num b)
{

if(a.x==b.x)
return a.y>b.y;
else
return a.x<b.x;
}
int main()
{
int T,t=1;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=1000;i++)
{
s[i].x=0;
int m=sqrt(i);
for(int j=1;j<=m;j++)//节省了不少时间;
{
if(i%j==0)
{
s[i].x++;
if(i!=j*j)s[i].x++;
}
}
s[i].y=i;
}
sort(s+1,s+1001,cmp);
cout<<"Case "<<t++<<": "<<s[n].y<<endl;
}
return 0;
}

原文地址:https://www.cnblogs.com/wally/p/wally.html