练习4(这次的有点水)

问题 B: 习题5-11 求多次落地弹球高度


时间限制: 1 Sec  内存限制: 12 MB



提交: 213  解决: 31  外部导入


提交状态讨论版 
  



题目描述 

一个球从100m的高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。 
 求它从第一次落地时,到第N次落地时,共经过了多少米,第N次反弹多高。 




输入 

一个正整数N,表示球落地的次数。 




输出 

length=球第N次落地时所经过了距离 
high=球第N次落地反弹的高度 
 小数点后保留4位小数。 
 注意:末尾输出换行。 




样例输入 Copy 

10



样例输出 Copy 

length=199.8047
high=0.0977
#include<bits/stdc++.h>
 
using namespace std;
 
int main()
{
   int n;
   while(cin>>n)
   {
       double a,b,s;
       int i;
       a=100.0;
       b=a/2;
       s=a;
       for(i=0;i<n-1;i++)
       {
           s=s+b;
           b=b/2;
       }
       printf("length=%.4f\n",s);
        printf("high=%.4f\n",b);
 
   }
    return 0;
}
 

这道题好像有争议。。。但是从样例来看,小球落地距离是没有算弹上来的距离的。

问题 A: 习题5-9 完数


时间限制: 1 Sec  内存限制: 12 MB



提交: 55  解决: 29  外部导入


提交状态讨论版 
  



题目描述 


一个数如果恰好等于它的因子和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,所以6是“完数”。 

编程输出1000以内的所有完数,每个完数输出一行,并按下面的格式输出其因子: 

6 its factors are 1,2,3 



输入 

无 



输出 


每个完数输出一行,并按下面的格式输出其因子: 

? its factors are ?,?,? 

  



样例输入 Copy 

无



样例输出 Copy 

6 its factors are 1,2,3
28 its factors are 1,2,4,7,14 
496 its factors are 1,2,4,8,16,31,62,124,248 



提示 


因子包含1但不包含其本身。 
int main()
{
    int n,i,s;
    int a[100];
    for(n=1;n<=1000;n++)
    {
        s=0;
        int j=0;
        for(i=1;i<n;i++)
            if(n%i==0)
            {
                s=s+i;
                a[j]=i;
                j++;
            }
            if(n==s)
            {
                cout<<n<<" ";
                cout<<"its factors are ";
                cout<<a[0];
                for(i=1;i<j;i++)
                {
                        cout<<","<<a[i];
                }
                cout<<endl;
 
            }
    }
    return  0;
}

(我的cb崩掉了,改用vs,所以头文件一大堆。。。所以不贴头文件了)

问题 C: 二分搜索(递归)


时间限制: 1 Sec  内存限制: 256 MB



提交: 0  解决: 0  外部导入


提交状态讨论版 
  



题目描述 

使用递归算法,实现二分搜索。 



输入 

多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。 



输出 

输出待查询值所在的位置,如果没有找到,则返回-1。 



样例输入 Copy 

3 1 2 3 2
4 0 1 3 4 2 




样例输出 Copy 

2
-1
int f(int a[],int x,int l,int r)
{
        if(l>r)
            return -1;
        int m=(l+r)/2;
        if(x==a[m])
            return m;
        else
            if(x>a[m])
                return f(a,x,m+1,r);
            else
                return f(a,x,l,m-1);
}
int main()
{
    int n;
    int a[1000],b[1000];
    while(cin>>n)
    {
        int i,x;
        for(i=0;i<n;i++)
            {
                cin>>a[i];
                b[i]=a[i];
        }
        cin>>x;
        sort(a,a+n);
        int s=f(a,x,0,n-1);
        if(s==-1)
            cout<<-1<<endl;
        else
        {
            for(i=0;i<n;i++)
            {
                if(b[i]==a[s])
                    cout<<i+1<<endl;
            }
        }
    }
    return  0;
}
问题 D: 二分搜索(非递归)


时间限制: 1 Sec  内存限制: 256 MB



提交: 0  解决: 0  外部导入


提交状态讨论版 
  



题目描述 

使用非递归算法,实现二分搜索。 



输入 

多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。 



输出 

输出待查询值所在的位置,如果没有找到,则返回-1。 



样例输入 Copy 

3 1 2 3 2
4 0 1 3 4 2 




样例输出 Copy 

2
-1
int f(int a[],int x,int n)
{
    int l=0;
    int r=n-1;
    while(l<=r)
    {
        int m=(l+r)/2;
        if(x==a[m])
            return m;
        if(x>a[m])
         l=m+1;
        else
            r=m-1;
    }
    return -1;
}
int main()
{
    int n;
    int a[1000],b[1000];
    while(cin>>n)
    {
        int i,x;
        for(i=0;i<n;i++)
            {
                cin>>a[i];
                b[i]=a[i];
        }
        cin>>x;
        sort(a,a+n);
        int s=f(a,x,n);
 
        if(s==-1)
            cout<<-1<<endl;
        else
        {
            for(i=0;i<n;i++)
            {
                if(b[i]==a[s])
                    cout<<i+1<<endl;
            }
        }
    }
    return  0;
}
问题 E: 数组合并


时间限制: 1 Sec  内存限制: 256 MB



提交: 0  解决: 0  外部导入


提交状态讨论版 
  



题目描述 

编写一个程序,将两个有序数组合并成一个更大的有序数组,要求时间复杂度为O(n)。 



输入 

多组数据输入,每组输入包括两行,每行第一个数字为数组长度n,然后输入n个有序整数。 



输出 

输出合并后的数组(升序),每组输出用一个空行隔开。 



样例输入 Copy 

3 1 3 5
3 2 4 6
2 1 2
4 3 4 5 6




样例输出 Copy 

1 2 3 4 5 6

1 2 3 4 5 6
void mm(int a[],int b[],int s,int m,int t)
{
    int i=s;
    int j=m+1;
    int k=s;
    while(i<=m&&j<=t)
    {
        if(a[i]<=a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }
    while(i<=m)
        b[k++]=a[i++];
    while(j<=t)
        b[k++]=a[j++];
}
 
int main()
{
    int n,m;
    int a[1000],b[1000];
    while(cin>>n)
    {
        int i;
        for(i=0;i<n;i++)
            cin>>a[i];
        cin>>m;
        for(i=n;i<m+n;i++)
            cin>>a[i];
        mm(a,b,0,n-1,n+m-1);
        cout<<b[0];
        for(i=1;i<n+m;i++)
            cout<<" "<<b[i];
        cout<<endl;
        cout<<endl;
    }
    return  0;
}
问题 G: 线性搜索


时间限制: 1 Sec  内存限制: 64 MB



提交: 0  解决: 0  201501010119


提交状态讨论版 
  



题目描述 

请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109,T的元素不重复。 



输入 

第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。 



输出 

用1行输出C。 



样例输入 Copy 

5
1 2 3 4 5
3
3 4 1




样例输出 Copy 

3
int f(int a[],int x,int n)
{
    int l=0;
    int r=n-1;
    while(l<=r)
    {
        int m=(l+r)/2;
        if(x==a[m])
            return m;
        if(x>a[m])
         l=m+1;
        else
            r=m-1;
    }
    return -1;
}
 
int main()
{
    int n,m;
    int a[520],b[520];
    while(cin>>n)
    {
        int i;
        for(i=0;i<n;i++)
            cin>>a[i];
        cin>>m;
        for(i=0;i<m;i++)
            cin>>b[i];
        sort(a,a+n);
        int flag=0;
        for(i=0;i<m;i++)
        {
            int s=b[i];
            if(f(a,s,n)!=-1)
                flag++;
        }
        cout<<flag<<endl;
    }
    return  0;
}
 
  
 
 
 
问题 F: 归并排序


时间限制: 1 Sec  内存限制: 256 MB



提交: 0  解决: 0  外部导入


提交状态讨论版 
  



题目描述 

编写一个程序,使用分治策略实现二路归并排序(升序)。 



输入 

多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。 



输出 

输出排序之后(升序)的一维整型数组,每组输出占一行。 



样例输入 Copy 

6 1 8 6 5 3 4
5 12 42 2 5 8




样例输出 Copy 

1 3 4 5 6 8
2 5 8 12 42
void m(int a[],int l,int r,int mid)
{
  int b[10000],i,j,k;
   
  for(k=l;k<=r;k++)
  b[k-l]=a[k];
   
  i=l;
  j=mid+1;
  for(k=l;k<=r;k++)
  {
    if(i>mid)
    {
        a[k]=b[j-l];
        j++;
      }
    else if(j>r)
    {
        a[k]=b[i-l];
        i++;
      }
    else if(b[i-l]>b[j-l])
    {
        a[k]=b[j-l];
        j++;
        }
    else
    {
        a[k]=b[i-l];
        i++;
            }
                     
     
      } 
     
}
  
void ms(int a[],int l,int r)
{
    if(l>=r)
    return ;
     
    int mid=(l+r)/2;
     
    ms(a,l,mid);
    ms(a,mid+1,r);
    m(a,l,r,mid);   
     
}
  
int main()
{
    int a[10000];
    int n,i;
    while(cin>>n)
    {
    for(i=0;i<n;i++)
        cin>>a[i];
    ms(a,0,n-1);
    cout<<a[0];
    for(i=1;i<n;i++)
        cout<<" "<<a[i];
    cout<<endl;
    }
    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/liufei-/p/10591036.html
今日推荐