練習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;
}
 

這道題好像有爭議。。。可是從樣例來看,小球落地距離是沒有算彈上來的距離的。c++

 

問題 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)  //傳進數組,key數,左右下標
{
        if(l>r)           //沒有找到key
            return -1;
        int m=(l+r)/2;    //m爲中間的數
        if(x==a[m])       //判斷key是否和m相等
            return m;
        else             //不然判斷key和m的大小
            if(x>a[m])    //返回右半邊的數組,l=m+1,r不變
                return f(a,x,m+1,r);
            else     //返回左半邊的數組,r=m-1,l不變
                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) //知足條件就一直進行這個循環,直到找出key或者找不到(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; }

 非遞歸:用while循環數組

 

問題 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;
 } 
相關文章
相關標籤/搜索