注意:所有代码均是根据题目描述进行了本地测试,没有在北邮oj上测试,不保证一定能AC。
点击链接查看历年机试题目汇总。
A牙膏问题
题目描述
4只牙膏比较价格,返回最便宜的牙膏。
输入:
第一行输入T,表示数据的组数。
第二行输入a b c d 表示4只牙膏的价格。
输出:
对于每个测试样例,输出最低价格。
样例输入
2
2 3 5 2
3 8 7 4
样例输出
2
3
解析
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<min(a,min(b,min(c,d)))<<endl;
}
return 0;
}
B闰年问题
题目描述
计连个年份间能被4整除且不能被100整除的普通闰年和能被400整除的世纪闰年的年数
输入:
第一行输入T,表示数据的组数
之后输入T组数据,每组输入x y代表始末年份(x<y)
输出:
返回x到y年 ∈[x,y] 内闰年数目count
样例输入
2
2999 3019
1999 2019
样例输出
4
5
解析
闰年定义:1.能被4整除但不能被100整除;
2.能被400整除。
#include <iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int x,y;
cin>>x>>y;
int count=0;
for(int i=x;i<=y;i++)
{
if(i%400==0) count++;
else if(i%4==0)
{
if(i%100) count++;
}
}
cout<<count<<endl;
}
return 0;
}
C链表操作
题目描述
一个出值为 1,2,3,4,…,n的n(0<n<=50)个节点的顺序链表,有以下3种操作方式:
1 移除节点值为x的节点
2 翻转链表,对调整个链表的顺序
3 查询链表值为x的节点所指的下一个节点的值
输入:
第一行输入T,表示数据的组数
每组第一行输入 n (表示节点数目) m (表示操作数目)
接下来m行分别输入 ope (操作方式) x (操作的节点值,操作方式为2时不会输入该值)
输出:
输出操作为3查询时,所查节点所指的下一个节点值,若没有查到或查到的节点为表尾 (没有下一节点),输出"NONE"
样例输入
1
6 6
3 6
1 2
3 1
2
1 5
3 6
样例输出
NONE
3
4
解析
直接用数组做了。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
/*
//纯数组解法
int n,m,a[51]={0},size;
cin>>n>>m;
size=n;
for(int i=1;i<=n;i++) a[i]=i;
while(m--)
{
int op,x;
cin>>op;
if(op==2)
{
reverse(a+1,a+size+1);
}
else if(op==1)
{
cin>>x;
int flag=size+1;
for(int i=1;i<=size;i++)
{
if(a[i]==x) flag=i;
if(i>flag)
{
a[i-1]=a[i];
}
}
size--;
}
else if(op==3)
{
cin>>x;
int flag=0;
for(int i=1;i<=size;i++)
{
if(a[i]==x)
{
if(i+1<=size)
{
flag=1;
cout<<a[i+1]<<endl;
}
break;
}
}
if(!flag) cout<<"NONE"<<endl;
}
}
*/
//vector数组解法
int n,m;
cin>>n>>m;
vector<int> a;
for(int i=1;i<=n;i++) a.push_back(i);
while(m--)
{
int op,x;
cin>>op;
if(op==2) reverse(a.begin(),a.end());
else if(op==1)
{
cin>>x;
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
{
if(*it==x) a.erase(it);
}
}
else if(op==3)
{
cin>>x;
int ok=0;
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
{
if(*it==x&&it!=a.end()-1)
{
ok=1;
cout<<*(it+1)<<endl;
break;
}
}
if(!ok) cout<<"NONE"<<endl;
}
}
}
return 0;
}
D网络连接
题目描述
有一个保证能联通的计算机网络(连通图),
Aij表示i计算机联通到j计算机的开销,
保证 :Aii = 0 , Aij = Aji ,Aij <= 100;
输入:
第一行输入T (T=1),表示数据的组数
每组第一行输入N (0 < N <= 50),表示网络内计算机的数目
然后n行输入Ai0 - Ai n-1
输出:
返回连通这个计算机网络需要的最小开销
样例输入
1
6
0 1 4 3 7 3
1 0 2 5 1 8
4 2 0 3 9 2
3 5 3 0 1 4
7 1 9 1 0 3
3 8 2 4 3 0
样例输出
7
解析
最小生成树。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define INF 0x3fffffff
#define MAXV 100
using namespace std;
int G[MAXV][MAXV],vis[MAXV],d[MAXV];
int prim(int n)
{
int sum=0;
memset(vis,0,sizeof(vis));
fill(d,d+MAXV,INF);
d[0]=0;
for(int i=0;i<n;i++)
{
int u=-1,min=INF;
for(int j=0;j<n;j++)
{
if(!vis[j]&&d[j]<min)
{
min=d[j];
u=j;
}
}
if(u==-1) return -1;
vis[u]=1;
sum+=min;
for(int j=0;j<n;j++)
{
if(G[u][j]!=INF&&!vis[j]&&G[u][j]<d[j])
{
d[j]=G[u][j];
}
}
}
return sum;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int N;
cin>>N;
fill(G[0],G[0]+MAXV*MAXV,INF);
for(int i=0;i<N;i++)
{
G[i][i]=0;
for(int j=0;j<N;j++)
{
int x;
cin>>G[i][j];
}
}
cout<<prim(N)<<endl;
}
return 0;
}