2016北邮计算机机试

目录

A.三元组

题目描述

输入

输出

思路

代码

B.寻找变化前01序列

题目描述

输入

输出

思路

代码

C.寻找i*j=m的个数

题目描述

输入

输出

思路

代码

D.字符串处理

题目描述

输入

输出

思路

代码


注:题目来自互联网,代码自己写的一些数据测试通过,但没有oj来评测,不敢保证完全正确,可以给大家一个解题思路。另外如有错误,欢迎评论指出,谢谢大家。

ps:这年的题是真的easy。

A.三元组

题目描述

给你一个长度为m的数组(数组元素从0到m-1),如果数组里有a[i]+a[j]==a[k](i,j,k大于等于0并且小于m),便称之为三元组。现在给你一个数组,让你求三元组的个数。
例如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

思路

满足条件使用暴力dfs即可,很简单

代码

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=100;
int a[MAXV];
int m;
int result=0;
void dfs(int count,int n){
	if(n==2){
		for(int i=0;i<m;i++){
			if(count==a[i]){
				result++;
			}
		}
		return;
	}
	for(int i=0;i<m;i++){
		dfs(count+a[i],n+1);
	}
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&m);
		for(int i=0;i<m;i++){
			scanf("%d",a+i);
		}
		result=0;
		dfs(0,0);
		printf("%d\n",result);
	}
	return 0;
} 

B.寻找变化前01序列

题目描述

给你一个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

思路

 满足5个1后面是个0就把那个0删掉。

代码

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
void recString(string &s){
	int count=0;
	for(int i=0;i<s.length();i++){
		if(s[i]=='1'){
			count++;
		}else{
			if(count==5){
				s.erase(s.begin()+i);
			}
			count=0;
		}
	}
}
int main(){
	int T;
	scanf("%d",&T);
	char buf[110];
	while(T--){
		scanf("%s",buf);
		string s(buf);
		recString(s);
		printf("%s\n",s.c_str());
	}
	return 0;
} 

C.寻找i*j=m的个数

题目描述

3*3的矩阵内容。

1 2 3

2 4 6

3 6 9

即a[i][j](1<=i<=n,1<=j<=n)=i*j。

问一个这样n*n的矩阵里面,里面m出现的次数。

 

例如n为3,m为6.

那么出现的次数就是2

输入

输入正整数N,表示N例测试(N<=20)。接着输入n(n<=10^5),m(<=10^9)。

输出

对每组输入数据,输出m出现的次数。

输入示例:
2
3 6
3 3
输出:
2
2

思路

这个题说的挺复杂,其实就是求小于n的约数个数,可以参考我以前的博客约束个数

代码

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int n,m;
int calMax(int x){
	int result=0;
	int i=1;
	for(i=1;i*i<x;i++){
		if(x%i==0 && i<=n && x/i<=n){
			result+=2;
		}
	}
	if(i*i==x) result++;
	return result;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		printf("%d\n",calMax(m));
	}
	return 0;
}

D.字符串处理

题目描述

有以下三种操作。
(1)COPY l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列复制到剪贴板t里面,覆盖t字符串。
例如s为abcde    t为pqr
执行COPY 1 2变为
s为abcde     t为bc
(2)CUT l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列剪切到剪贴板t里面(删除s串中的l到r的序列),覆盖t字符串。

例如s为abcde    t为pqr
执行CUT 1 2变为
s为ade     t为bc
(3)PASTE p(0<=p<n),n代表s串的长度。这个表示将t串插入到s串p位置的后面。t保持不变。

例如s为abcde    t为pqr
执行PASTE 1 变为
s为abpqrcde  t为pqr

输入

输入正整数N,表示N例测试。首先给你s串,再给你一个m,然后给你m个操作。

输出

对每个操作,输出操作后的s串。

输入示例:
2
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
abc
3
CUT 0 1
COPY 0 0
PASTE 0
输出:
ade
ade
adade
adadade
aade
c
c
cc

思路

就是一个字符串处理,不知道这个题为啥会出压轴的位置额,是我太菜忽略了细节吗,感觉简单的可怕啊。 

代码

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int N;
	scanf("%d",&N);
	while(N--){
		char buf[1000];
		scanf("%s",buf);
		string s(buf);
		string t;
		int m;
		scanf("%d",&m);
		while(m--){
			char buf2[50];
			scanf("%s",buf2);
			string ord(buf2);
			if(ord=="COPY"){
				int l,r;
				scanf("%d%d",&l,&r);
				t=s.substr(l,r-l+1);
		//		cout<<"t="<<t<<endl;
				printf("%s\n",s.c_str());
			}else if(ord=="CUT"){
				int l,r;
				scanf("%d%d",&l,&r);
				t=s.substr(l,r-l+1);
		//		cout<<"t="<<t<<endl;
				s.erase(s.begin()+l,s.begin()+r+1);
				printf("%s\n",s.c_str());
			}else if(ord=="PASTE"){
				int p;
				scanf("%d",&p);
				s.insert(p+1,t);
				printf("%s\n",s.c_str());
			}
		}
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值