問題 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; }