2016年北邮机试真题

A、 三元组

Time Limit: 1000 ms
Memory Limit: 256 mb
给你一个长度为m的数组(数组元素从0到m-1),如果数组里有a[i]+a[j]==ak,便称之为三元组。现在给你一个数组,让你求三元组的个数。
例如m为2,里面的元素为(0,0)
那么三元组为
(a[0],a[0],a[0])
(a[0],a[0],a[1])
(a[0],a[1],a[0])
(a[0],a[1],a[1])
(a[1],a[0],a[0])
(a[1],a[0],a[1])
(a[1],a[1],a[0])
(a[1],a[1],a[1])
输出答案为8.

输入输出格式
输入描述:
输入正整数N,表示N例测试。接着输入N组数据,每组输入m(1<=m<=50),表示数组长度,然后输入这个数组。
输出描述:
对每组输入数据,输出三元组的个数。

输入输出样例
输入样例#:
2
2
0 0
5
1 1 1 2 1
输出样例#:
8
16

题目来源
北京邮电大学2016年计算机考研机试试题
真题链接在此

思路:直接暴力,三层for循环,尝试每一种可能性,再判断是否符合题目要求即可

#include
#include
#include
#include
#include
using namespace std;
int main(){
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int h[100];
		int n;
		cin>>n;
		for(int j=1;j<=n;j++)
			cin>>h[j];
		int sum=0;
		for(int k1=1;k1<=n;k1++){
			for(int k2=1;k2<=n;k2++){
				for(int k3=1;k3<=n;k3++){
					if(h[k1]+h[k2]==h[k3])
						sum++;
				}
			}
		}
		cout<<sum<<endl;
	}
	return 0;
} 

B、 寻找变化前01序列

Time Limit: 1000 ms
Memory Limit: 256 mb
问题描述
给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0。例如1111110,会变成11111010。
现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的01序列。
例如给你11111010
你需要输出1111110

输入描述:
输入正整数N,表示N例测试。接着输入N组数据,每组输入经过HDLC处理过的01序列(长度小于100)。
输出描述:
对每组输入数据,输出HDLC处理前的01序列。

输入输出样例
输入样例#:
2
11111010
1111100
输出样例#:
1111110
111110

题目来源
北京邮电大学2016年计算机考研机试试题
真题链接在此

思路:这里用到了string的erase函数
string.erase(pos,n) //删除从pos开始的n个字符 如:string.erase(0,1); 删除第一个字符,然后从前向后用一个变量记录当前连续的1的个数即可

#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		string h;
		cin>>h;
		char k[105];
		int num=0;
		for(int j=0;j<h.size();j++){
			if(h[j]=='0')
				num=0;
			else
				num++;
			if(num==5){
				num=0;
				h.erase(j+1,1);
			}
		}
		cout<<h<<endl;
	}
	return 0;
}

C、 寻找奇特的数

Time Limit: 1000 ms
Memory Limit: 256 mb
3*3的矩阵内容。

1 2 3
2 4 6
3 6 9

即a[i][j]=i*j。

(1<=i<=n,1<=j<=n)
问一个这样n*n的矩阵里面,里面m出现的次数。

例如n为3,m为6.

那么出现的次数就是2

输入输出格式
输入描述:
输入正整数N,表示N例测试(N<=20)。接着输入n(n<=10^5)
m(m<=10^9)
输出描述:
对每组输入数据,输出m出现的次数。

输入输出样例
输入样例#:
2
3 6
3 3
输出样例#:
2
2

题目来源
北京邮电大学2016年计算机考研机试试题
真题链接在此

思路:这里可以将该矩阵看成一个上三角矩阵,这样我们只需要统计上三角的部分,最后的结果=主对角线的种类+上三角中除了主对角线的种类数*2,简单模拟即可

#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main(){
	int n;
	cin>>n;
	int t1,t2;
	for(int i=1;i<=n;i++){
		cin>>t1>>t2;
		int num=0;
		int sum=0;
		for(int i=1;i<=sqrt(t2);i++){
			if(t2%i==0){
				int k=t2/i;
				if(k<=t1){
					if(k==i)
						sum++;
					else
						num++;
				}
			}
		}
		sum=sum+num*2;
		cout<<sum<<endl;
	}
	return 0;
}

D、 复制、剪切、粘贴

Time Limit: 1000 ms
Memory Limit: 256 mb
有以下三种操作。

(1)COPY l r(0<=l<=r

例如s为abcde t为pqr

执行COPY 1 2变为

s为abcde t为bc

(2)CUT l r(0<=l<=r

例如s为abcde t为pqr

执行CUT 1 2变为

s为ade t为bc

(3)PASTE p(0<=p

例如s为abcde t为pqr

执行PASTE 1 变为

s为abpqrcde

t为pqr

输入输出格式
输入描述:
多组测试数据。
首先给你s串,再给你一个m,然后给你m个操作。
输出描述:
对每个操作,输出操作后的s串。

输入输出样例
输入样例#:
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
输出样例#:
ade
ade
adade
adadade
aade

题目来源
北京邮电大学2016年计算机考研机试试题
真题链接在此

思路:开了两个char类型的数组,然后维护数组的长度,进行不同种类操作的模拟即可,如果用char数组的话,必须维护数组的长度,不必关心数组长度以外的数组中的内容是什么,因为也用不到。

#include
using namespace std;
int main(){
	char s[10010];
	char t[10010];
	int l1=0,l2=0;  //l1代表数组s的长度,l2代表数组t的长度
	int n;
	cin>>s;
	cin>>n;
	for(int i=0;;i++){
		if(s[i]!='\0')
			l1++;
		else
			break;
	}
	for(int i=1;i<=5;i++){
		string h;
		cin>>h;
		int m1,m2;
		if(h=="CUT"){
			cin>>m1>>m2;
			int kk=m2-m1+1;
			int ll=0;
			for(int j=m1;j<=m2;j++){
				t[ll]=s[j];
				ll++;
			}
			l2=ll;
			for(int j=m2+1;j<l1;j++)
				s[j-kk]=s[j];
			l1-=kk;
			
		}
		else if(h=="COPY"){
			cin>>m1>>m2;
			int ll=0;
			for(int j=m1;j<=m2;j++){
				t[ll]=s[j];
				ll++;
			}
			l2=ll;
		}
		else if(h=="PASTE"){
			cin>>m1;
			for(int j=l1-1;j>=m1+1;j--){
				s[j+l2]=s[j];
			}
			int kk=0;
			for(int j=m1+1;j<=m1+l2;j++){
				s[j]=t[kk];
				kk++;
			}
			l1+=l2;
		}
		for(int j=0;j<l1;j++)
			cout<<s[j];
		cout<<endl;
	}
	return 0;
} 

你可能感兴趣的:(2016年北邮机试真题)