问题 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; }