回 帖 发 新 帖 刷新版面

主题:[原创]第29次编程比赛第1题

以下是第29次编程比赛第1题的相关事宜:
比赛时间:
星期四晚上8:00到星期六晚上10:00

注意事项与ccpp的第二题相同,这里就不再重复。


   有一整数序列,求其序列第k小的数。已知序列每个数不大于1000,
长度不超过1000,有可能有重复数字。
    如:10 50 2 31 7 6 16第二小的数为6。[color=FF0000](k以1为起点)[/color]
函数接口为:
    int KthNumOfList(int List[],int len,int k);
    int List[]为整型序列
    int len为序列长度
    int k  为要求第几小
    返回值为第k小的数

附加题:(没有什么思路,拿出来给大家讨论,不是比赛题目)
同济ACM的题
在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。 
如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 
对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 
首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。 
如: 
19/45=1/3 + 1/12 + 1/180 
19/45=1/3 + 1/15 + 1/45 
19/45=1/3 + 1/18 + 1/30, 
19/45=1/4 + 1/6 + 1/180 
19/45=1/5 + 1/6 + 1/18. 
最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。 
给出a,b(0〈a〈b〈1000),编程计算最好的表达方式。 

Input
第一行:N 表示有N组测试数据,每组测试数据为一行包含a,b(0〈a〈b〈1000)。 

Output
每组测试数据若干个数,自小到大排列,依次是单位分数的分母。 

Sample Input
1
19 45

Sample Output
5 6 18

回复列表 (共27个回复)

21 楼

int KthNumOfList(int List[],int len,int k)
{
  int i,j,t;
  int temp[1000];
  for (i=0;i<len;i++)
      temp[i]=List[i];

  for (i=0;i<len-1;i++)
 {
    for (j=i+1;j<len;j++)
      
        if(temp[i]>temp[j])
        { 
          t=temp[i];
          temp[i]=temp[j];
          temp[j]=t; 
        };
 }
  
  return temp[k-1];
}

22 楼


看下啊 呵呵!

23 楼


怎么看见啊?

24 楼

#include <iostream>
using namespace std;
int fecm(const void *p1,const void *p2)
{
    int a1=*(const int *)p1;
    int a2=*(const int *)p2;
    if(a1>a2)
        return 1;
    else return -1;
}
int KthNumOfList(int List[],int len,int k)
{
    qsort(List,len,sizeof(int),*fecm);
    return List[k-1];
}
main()
{
    int List[]={10,50,2,31,7,6,16};
    cout<<KthNumOfList(List,7,2);
}

25 楼

int Kth2(int* list,int len,int k)
{
    vector<int> v;
    int partmax=0;
    for(int i=0;i<len;++i)
    {
        if(k)
        {
            if(list[i]>partmax)
                partmax=list[i];
            v.push_back(list[i]);
            --k;
        }
        else if(list[i]<partmax)
        {
            *max_element(v.begin(),v.end())=list[i];
            partmax=*max_element(v.begin(),v.end());
        }
    }
    return partmax;
}

26 楼

学习学习

27 楼

void heapify(int node,int len,int List[])
{
   int i,j,min,t;
   i=node*2;
   j=node*2+1;
   if(i<=len && List[i]<List[node])min=i;
   else min=node;
   if(j<=len && List[j]<List[min])min=j;
   if(min!=node)
   {
      t=List[node];List[node]=List[min];List[min]=t;
      heapify(min,len,List);
   }
}

int KthNumOfList(int List[],int len,int k)
{
   int t,nums[1001],i,times=1,size=len;
   for(i=1;i<=len;++i)nums[i]=List[i-1];
   for(i=len/2;i>=1;--i)heapify(i,len,nums);
   while(k!=times)
   {
      t=nums[1];nums[1]=nums[size];nums[size]=t;
      size--;
      heapify(1,size,nums);
      ++times;
   }
   return nums[1];
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册