1. 以下不属于面向对象程序设计语言的是()。
2. 以下奖项与计算机领域最相关的是()。
3. 目前主流的计算机储存数据最终都是转换成()数据进行储存。
4. 以比较作为基本运算,在N个数中找出最大数,最坏情况下所需要的最少的比较次数为 ()。
5. 对于入栈顺序为a,b,c,d,e的序列,下列()不是合法的出栈序列。
6. 对于有n个顶点、m条边的无向连通图(m>n),需要删掉()条边才能使其成为一棵树。
7. 二进制数101.11对应的十进制数是()。
8. 如果一棵二叉树只有根结点,那么这棵二叉树高度为1。请问高度为5的完全二叉树有()种不同的形态?
9. 表达式a*(b+c)*d的后缀表达式为(),其中“*”和“+”是运算符。
10. 6个人,两个人组一队,总共组成三队,不区分队伍的编号。不同的组队情况有()种。
11. 在数据压缩编码中的哈夫曼编码方法,在本质上是一种()的策略。
12. 由1, 1, 2, 2, 3这五个数字组成不同的三位数有()种。
13. 考虑如下递归算法 solve (n) if n<=1 return 1 else if n> =5 return n*solve(n-2) else return n*solve (n-1) 则调用solve(7)得到的返回结果为()。
14. 以a为起点,对右边的无向图进行深度优先遍历,则b、c、d、e四个点中有可能作 为最后一个遍历到的点的个数为()。
15. 有四个人要从A点坐一条船过河到B点,船一开始在A点。该船一次最多可坐两个人。已知这四个人中每个人独自坐船的过河时间分别为1, 2, 4, 8,且两个人坐船的过河时间为两人独自过河时间的较大者。则最短()时间可以让四个人都过河到B点(包括从B点把船开回A点的时间)。
1.
#include <iostream> using namespace std; int n; int a [1000] ; int f (int x) { int ret=0; for (; x; x&=x-1) ret++; return ret; } int g (int x) { return x & -x ; } int main () { cin>>n; for (int i = 0; i < n; i++)scanf("%d",&a[i]); for (int i=0; i < n; i++) cout<<f(a[i])+g(a[i]))<<" "; cout<<endl; return 0; }
2.
#include <iostream> #include <string> using namespace std; char base[64] ; char table[256] ; void init () { for (int i=0; i<26; i++)base[i]='A'+i; for (int i=0; i<26; i++)base[26 +i]='a'+i; for (int i=0; i<10; i++)base[52+i]='0'+i; base [62] = '+', base[63] ='/'; for (int i =0; i<256; i++)table[i]=0xff; for (int i =0; i <64; i++) table[base[i]]=i; table['='] =0; } string decode (string str) { string ret; int i; for (i=0; i < str.size(); i +=4){ ret +=table[str [1]] <<2|table[str[1+1]]>> 4; if (str[i+2] !='=') ret += (table[str[i+1] ] &0x0f) <<4|table[str[i+2]] >> 2; if (str [i+3] !='=') ret += table[str[i+2] ] << 6 | table[str[i+3]]; } return ret; } int main () { init () ; cout<<(int)table[0])<<endl; string str; cin>>str; cout<<decode (str) <<endl; return 0; }
3.
#include <iostream> using namespace std; const int n=100000; const int N=n+1; int m; int a[N], b[N], c[N], d[N] ; int f[N], g[N] ; void init () { f[1]=g[1]=1; for (int i=2; i <= n; i++) { if (!a[i] ) { b[m++] =i; c[i] =1,f[i]=2; d[i] =1,g[i] =i+1; } for (int j = 0; j < m && b[j] * i <= n; j++) { int k=b[j] ; a[i*k] =1; if (i%k==0) { c[i*k] =c[i] +1; f[i*k] =f[i] /c[i*k] * (c[i*k]+1) ; d[i*k] =d[i] ; g[i*k] =g[i] *k+d[i] ; break; } else { c[i*k] =1; f[i*k] =2*f[i] ; d[i*k] =g[i] ; g[i*k] =g[i] * (k+1) ; } } } } int main () { init () ; int x; cin>>x; cout<<f[x]<<" "<<g[x]<<endl ; return 0; }
1. (Josephus 问题) 有n个人围成一个圈,依次标号0至n-1.从0号开始,依次 0, 1, 0, 1,...交替报数,报到1的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。 试补全模拟程序。
#include <iostream> using namespace std; const int MAXN =1000000; int F[MAXN]; int main() { int n; cin >>n; int i = 0,p = 0, c = 0; while (___(1)___) { if(F[i] == 0 ) { if(___(2)___) { F[i] = 1; ___(3)___; } ___(4)___; } ___(5)___; } int ans = -1; for (i =0 ; i < n; i++) if (F[i] == 0) ans = i; cout << ans << endl; return 0; }
2. (矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩形, 满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。 试补全枚举算法。
#include <iostream> using namespace std; struct point { int x, y, id; }; bool equals(point a, point b) { return a.x == b.x && a.y == b.y; } bool cmp(point a, point b) { return ___(1)___; } void sort(point A[], int n) { for(int i=0; i<n; i++) for(int j=1; j<n; j++) if (cmp(A[j], A[j - 1])) { point t = A[j]; A[j] = A[j - 1]; A[j-1]=t; } } int unique(point A[], int n) { int t=0; for(int i=0; i<n; i++) if (___(2)___) A[t++] = A[i]; return t; } bool binary_search(point A[], int n, int x, int y) { point p; p.x = x; p.y =y; p.id = n; int a=0,b=n-1; while(a<b) { int mid = ___(3)___; if (___(4)___) a=mid+1; else b = mid; } return equals(A[a], p); } const int MAXN = 1000; point A[MAXN]; int main() { int n; cin >> n; for(int i=0; i<n; i++) { cin >> A[i].x >> A[i].y; A[i].id = i; } sort(A, n); n = unique(A, n); int ans = 0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) if ( ___(5)___ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n, A[j].x, A[i].y)) { ans++; } cout<<ans<<endl; return 0; }