2016北邮计算机机试

Problem A

1.三元组
问题描述:
给你一个长度为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.
Input
输入正整数N,表示N例测试。接着输入N组数据,每组输入m(1<=m<=50),表示数组长度,然后输入这个数组。
Output
对每组输入数据,输出三元组的个数。

Sample Input
2
2
0 0
5
1 1 1 2 1
Sample Output
8
16
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int main(){
    int N;
    scanf("%d",&N);
    while(N--){
        int m;
        scanf("%d",&m);
        int a[m];
        int size=0;
        for(int i=0;i<m;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<m;i++){
            for(int j=0;j<m;j++){
                for(int k=0;k<m;k++){
                    if(a[i]+a[j]==a[k]){
                        size++;
                    }
                }
            }
        }
        printf("%d\n",size);
    }
    return 0;
}

Problem B

2.寻找变化前01序列
问题描述
给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0。例如1111110,会变成11111010。
现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的01序列。
例如给你11111010
你需要输出1111110
Input
输入正整数N,表示N例测试。接着输入N组数据,每组输入经过HDLC处理过的01序列(长度小于100)。
Output
对每组输入数据,输出HDLC处理前的01序列。

Sample Input
2
11111010
1111100
Sample Output
1111110
111110
#include<bits/stdc++.h>
#include<stdio.h>
int main(){
    int N;
    scanf("%d",&N);
    while(N--){
        char str[120];
        scanf("%s",&str);
        int len=strlen(str);
        char ans[100];
        int size=0;
        int flag=0;
        for(int i=0;i<len;i++){
            if(flag==5){
                flag=0;
                continue;
            }
            if(str[i]=='1'){
                flag++;
                ans[size++]=str[i];
            }
            if(str[i]=='0'){
                flag=0;
                ans[size++]=str[i];
            }
        }
        ans[size]='\0';
        printf("%s\n",ans);
    }
}

Problem C

在这里插入图片描述

Sample Input

2
3 6
3 3
Sample Output
2
2

这个题感觉考的是数学问题,我的理解首先是因为矩阵式对称的,故直接求一半,对角线上的+1,其他位置+2;
其次,实际是找m的因子,能分解因子的所有情况求出来就好。

#include<bits/stdc++.h>
#include<stdio.h>
int main(){
    int N;
    scanf("%d",&N);
    while(N--){
        int n,m;
        scanf("%d%d",&n,&m);
        int max=sqrt(m);
        int size=0;
        for(int i=1;i<=max;i++){
            int ans=m/i;
            int flag=ans*i;
            if(i>n||ans>n)
                continue;
            if(flag==m){
                size+=2;
            }
        }
        if(max*max==m)
            size++;
        printf("%d\n",size);
    }
}

Problem D

在这里插入图片描述
在这里插入图片描述

Sample Input
abcde
5
CUT  1 2
COPY 0 1
PASTE 1
PASTE 1
CUT  1 3
Sample Output
ade
ade
adade
adadade
aade

这题废了很久,如果考试肯定没a过,我调试了很久都没解决这个问题,我的m一旦进入循环就会被重置为0,不知道那个地方有问题,哪个数组越界覆盖了。。。。头大的不行,最后还是没解决这个问题,但是显示的是没问题,有大佬如果发现问题在哪请留言,谢谢了

#include<bits/stdc++.h>
#include<stdio.h>
int copy(char str[30],char t[30],int l,int r){
    int i;
    for(i=l;i<=r;i++){
        t[i-l]=str[i];
    }
    for(;i<30;i++)
        t[i]='\0';
    for(int i=0;str[i]!='\0';i++)
        printf("%c",str[i]);
    printf("\n");

}
int cut(char str[30],char t[30],int l,int r){
    int i;
    int len=strlen(str);
    for(i=l;i<=r;i++){
            t[i-l]=str[i];
    }
    t[i-l]='\0';
    for(int i=l;i+r-l+1<30;i++)
        str[i]=str[i+r-l+1];
    for(int i=0;str[i]!='\0';i++)
        printf("%c",str[i]);
    printf("\n");
}
int paste(char str[30],char t[30],int p){
    char ans[30];
    int lt=strlen(t);
    int ls=strlen(str);
    int len=ls+lt;
    for(int i=0;i<len;i++){
        if(i<=p)
            ans[i]=str[i];
        else if(i>p&&i<p+lt+1){
            ans[i]=t[i-p-1];
        }
        else{
            ans[i]=str[i-lt];
        }
    }
    for(int i=0;i<30;i++)
        str[i]=ans[i];
    for(int i=0;str[i]!='\0';i++)
        printf("%c",str[i]);
    printf("\n");
}
int main(){
    int N;
    scanf("%d",&N);
    while(N){
        char str[30];
        char t[30];
        int mn;
        scanf("%s",str);
        scanf("%d",&m);
        while(m){
            char mis[5];
            int l,r;
            scanf("%s",mis);
            if(mis[0]=='C'){
                scanf("%d%d",&l,&r);
                if(mis[1]=='O'){
                    copy(str,t,l,r);
                }
                else{
                    cut(str,t,l,r);
                }
            }
            else{
                int p;
                scanf("%d",&p);
                    paste(str,t,p);
            }
            m--;
        }
        N--;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值