2018北邮网研机试

注意:所有代码均是根据题目描述进行了本地测试,没有在北邮oj上测试,不保证一定能AC。

点击链接查看历年机试题目汇总。

A商品总价格

题目描述

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

样例输入

2
2
1.00  2
0.50  2
1
100.0 1

样例输出

3.00
100.00

解析

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		double sum=0;
		cin>>n;
		while(n--)
		{
			double x,y;
			cin>>x>>y;
			sum+=x*y;
		}
		cout<<fixed<<setprecision(2)<<sum<<endl;
	}
	return 0;
}

B V字形数列

题目描述

V字型数列,当且仅当三元组i<j<k,且 a[i]>a[j]并且a[k]>a[j],算作一个V型数列。
输入
第一行为测试数据组数T
每组数据第一行为该数组的数字个数
接下来一行为数组元素
输出:
输出对应数组中符合v字形数列的个数

样例输入

2
3
2 1 2
5
2 1 2 1 2

样例输出

1
4


解析

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	int T,n;
	cin>>T;
	while(T--)
	{
		int a[1001],count=0;
		cin>>n;
		for(int i=0;i<n;i++) cin>>a[i];
		for(int i=1;i<n-1;i++)
		{
			int left=0,right=0; 
			for(int j=0;j<i;j++)
			{
				if(a[j]>a[i]) left++;
			}
			for(int j=i+1;j<n;j++)
			{
				if(a[j]>a[i]) right++;
			}
			count+=left*right;
		}
		cout<<count<<endl;
	}
	return 0;
}

C简单的24点

题目描述

输入为4个数字,a,b,c,d。若a^b^c^d=24,则称该数组满足24点,其中^可以为+、-、*、/任一个,若不能得到结果24,则称该数组不满足24点。(计算为实型)
输入:
第一行为测试组数t
接下来t行,每一行为四个整数a,b,c,d,测试是否满足24点
1<=a,b,c,d<10000
输出
在每一行
若满足,输出YES
不满足,输出NO


解析

三个运算符的优先级进行排序,因为不可以加括号,分4种情况。

#include <iostream>
#include <cstring>
using namespace std;
double cal(double x,double y,char c)
{
	if(c=='+') return x+y;
	else if(c=='-') return x-y;
	else if(c=='*') return x*y;
	else return x/y;
}
int main()
{
	int T;
	double a,b,c,d;
	cin>>T;
	while(T--)
	{
		int ok=0,x,y,z;
		char ch[4]={'+','-','*','/'};
		cin>>a>>b>>c>>d;
		//3个运算符的优先顺序 123 132 213 231 312
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				for(int k=0;k<4;k++)
				{
                    //0代表低优先级,1表示高优先级,加减为0,乘除为1
					x=(i<2)?0:1; 
					y=(j<2)?0:1; 
					z=(k<2)?0:1;
					if(x>=y&&y>=z) //123
					{
						if(cal(cal(cal(a,b,ch[i]),c,ch[j]),d,ch[k])==24)
						{
							ok=1;
							goto out; //一般还是不要用goto语句
						} 
					}
					else if(x<y&&y>z) //213
					{
						if(cal(cal(a,cal(b,c,ch[j]),ch[i]),d,ch[k])==24)
						{
							ok=1;
							goto out;
						}
					}
					else if(x<y&&x<z) //312
					{
						if(cal(a,cal(cal(b,c,ch[j]),d,ch[k]),ch[i])==24)
						{
							ok=1;
							goto out;
						}
					}
					else if(x>=y&&y<z) //132 231
					{
						if(cal(cal(a,b,ch[i]),cal(c,d,ch[k]),ch[j])==24)
						{
							ok=1;
							goto out;
						}
					}
				}
			}
		}
		out:
			if(ok) cout<<"YES"<<endl;
			else cout<<"NO"<<endl;
	}
	return 0;
}

D网络连接

题目描述

对于每一个零件都有一个适宜温度区间,[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


解析

贪心,将所有区间记录到同一个数轴上,这些点从左到右遍历,
如果是左节点,加y-x,如果是右节点,减y-z。

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
struct tem
{
	int sig;
	int num;
}T[20001];
bool cmp(tem a,tem b)
{
	return a.num<b.num;
}
int main()
{
	int n,x,y,z;
	int sum=0,max=0;
	cin>>n>>x>>y>>z;
	for(int i=0;i<n*2;i++)
	{
		cin>>T[i].num;
		if(i%2==0) T[i].sig=0;
		else T[i].sig=1;
	}
	sort(T,T+n*2,cmp);
	sum=x*n;
	max=sum;
	int cur=T[0].num,ans;
	for(int i=0;i<n*2;i++)
	{
		if(T[i].sig==0)sum=sum+y-x;
		if(T[i].sig==1) sum=sum-(y-z);
		if(sum>max)
		{
			max=sum;
			ans=T[i].num;
		}
		cur=T[i].num;
	}
	cout<<max<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值