2018北邮网研机试真题(大佬们的回忆版)

Problem 1

题目: 类似超市结账,计算购买的商品的总价格。
输入:
第一行为测试数据组数T(0< T <= 10)
每组数据第一行为购买商品的种类n,接下来n行,每行两个数据,第一个为商品价格,第二个为商品数量,价格为实型。

输出:
每一行输出相对应数据的总价值,保留两位小数。

测试数据:
2
2
1.00  2
0.50  2
1
100.0 1
输出:
3.00
100.00

emmm,感觉这个基本算是送分题,简单的话直接跟我一样,直接double就好,输出的时候注意下格式就行用%.2f来输出

#include<stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		double ans=0;
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			double a;
			int b;
			scanf("%lf%d",&a,&b);
			ans+=a*b;
		}
		printf("%.2lf\n",ans);
	}
	return 0;
}

Problem 2

题目:V字型数列,当且仅当三元组i
输入:
第一行为测试数据组数T
每组数据第一行为该数组的数字个数
接下来一行为数组元素

输出
输出对应数组中符合v字形数列的个数

测试数据:
2
3
2 1 2
5
2 1 2 1 2
输出:
1
4

这个一开始写的发现有点小问题,忘了跳出循环了,加了个continue就好了。

#include<stdio.h>
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int buf[100];
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&buf[i]);
        int num=0;
        for(int i=0;i<n;i++){
            if(i==n-1)
                continue;
            for(int j=i+1;j<n;j++){
                if(j==n-1)
                    continue;
                for(int k=j+1;k<n;k++){
                    if(buf[i]>buf[j]&&buf[k]>buf[j])
                        num++;
                }
            }
        }
        printf("%d\n",num);
    }
    return 0;
}

Problem 3

题目:简单的24点
输入为4个数字,a,b,c,d。若abcd=24,则称该数组满足24点,其中可以为+、-、*、/任一个,若不能得到结果24,则称该数组不满足24点。(计算为实型)

输入
第一行为测试组数t
接下来t行,每一行为四个整数a,b,c,d,测试是否满足24点
1<=a,b,c,d<10000(右区间忘了,反正四个数不为0)

输出
在每一行
若满足,输出YES
不满足,输出NO

这个题没有测试用例,我就自己写了几个。。

测试数据:
6
2 10 2 10
1 2 3 4
2 2 2 3
40 2 2 2
1 3 5 7
1 1 1 1
输出:
YES
YES
YES
YES
NO
NO

这道题有点难。。。写了三遍,换了两个方法,第一次直接跑超时了。。第二次想按照简单计算器来写,不过写了一会感觉有点偏题了,后来参考了学长大佬的写法,大佬原版地址的放到下面。。
[https://blog.csdn.net/xiaqinnnn/article/details/79809427]

#include<stdio.h>
int yxj(int i){
    return i>2?1:0;
}
int cp(float a,float b,int i){
    switch(i){
    case 1:return a+b;
    case 2:return a-b;
    case 3:return a*b;
    case 4:return a/b;
    }
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        float a,b,c,d;
        scanf("%f%f%f%f",&a,&b,&c,&d);
        int flag=0;
        for(int i=1;i<5;i++){
            if(flag==1)
                break;
            for(int j=1;j<5;j++){
                if(flag==1)
                    break;
                for(int k=1;k<5;k++){
                    int x=yxj(i);
                    int y=yxj(j);
                    int z=yxj(k);
                    int ans;
                    if(x==y&&y>z||y==z&&x>y||x==y&&y==z){
                        float ans1=cp(a,b,i);
                        float ans2=cp(ans1,c,j);
                        ans=cp(ans2,d,k);
                    }//110 100 111 000
                    else if(x==y&&z>y||x==z&&x>y){
                        float ans1=cp(c,d,k);
                        float ans2=cp(a,b,i);
                        ans=cp(ans1,ans2,j);
                    }//001 101
                    else if(x==z&&x<y){
                        float ans1=cp(b,c,j);
                        float ans2=cp(a,ans1,i);
                        ans=cp(ans2,d,k);
                    }//010
                    else if(y==z&&x<y){
                        float ans1=cp(b,c,j);
                        float ans2=cp(ans1,d,k);
                        ans=cp(a,ans2,i);
                    }//011
                    if(ans==24){
                        printf("YES\n");
                        flag=1;
                        break;
                    }
                }
            }
        }
        if(flag==0)
            printf("NO\n");
    }
    return 0;
}

Problem 4

对于每一个零件都有一个适宜温度区间,[Ri,Ji],当温度t<Ri,零件价值为x,当t>Ji,零件价值为z;当温度适宜,价值为y。且y>x,y>z。此刻,有一恒温箱,可确定温度t。

输入

第一行按顺序分别为 n,x,y,z。0<n<20000

接下来n行为 每一个零件的适宜温度区间0<Ri<Ji<109

输出

确定一个温度值t,在这温度下所有零件的总价值最大,并输出该价值

测试数据
3 1 3 2
1 4
2 5
7 10
输出
7   

这道题感觉比上一道要简单一些,直接第一层把温度循环,第二层依次尝试加所有的单个价值,遍历得出最大价值

#include<stdio.h>
struct yuanjian{
    int l;
    int h;
}yj[100];
int main(){
    int n,x,y,z;
    scanf("%d%d%d%d",&n,&x,&y,&z);
    int mt=0;
    for(int i=0;i<n;i++){
        scanf("%d%d",&yj[i].l,&yj[i].h);
        if(mt<yj[i].h)
            mt=yj[i].h;
    }
    int max=0;
    for(int i=0;i<=mt;i++){
        int flag=0;
        for(int j=0;j<n;j++){
            if(i<yj[j].l){
                flag+=x;
            }
            else if(i>yj[i].h){
                flag+=z;
            }
            else
                flag+=y;
        }
        if(max<flag)
            max=flag;
    }
    printf("%d\n",max);
    return 0;
}

上面的代码除了24点应该没a出来,其他我自己算了下应该是规定时间内a出来了。。。摸了摸头顶,发量又变的稀疏了些,上面毕竟我没有北邮环境去跑,所以上面的代码仅限于给出的用例可以跑通,其他的就不是很清楚了,有错误的话大佬请指正,菜鸡一枚,当个笔记本用了。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值