注意:所有代码均是根据题目描述进行了本地测试,没有在北邮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;
}