Problem.A 中位数
思路
常规题稳拿分
#include<iostream>
using namespace std;
#define MAXN 110
int arr[MAXN];
int main(){
int T,N,mid,i,input_sum,flag;
float mid_f;
cin>>T;
while(T--){
cin>>N;
for(i=0;i<N;i++){
flag=-1;
cin>>arr[i];
input_sum=i+1;
if(input_sum%2==1){
mid=arr[input_sum/2];
flag=0;
}
else{
mid_f=(arr[input_sum/2] + arr[input_sum/2-1])/2.0;
flag=1;
}
}
if(flag==0)
cout<<mid<<endl;
else if(flag==1)
cout<<mid_f<<endl;
}
return 0;
}
链接:北邮OJ_中位数
Problem.B 内存分配
思路
读题!读题!!读题!!!重要的事说三遍!这里的最佳分配是将一整块分配出去,不是将一块中取一部分,剩下一部分。
#include<iostream>
#include<limits.h>
using namespace std;
#define MAXN 101
typedef long long ll;
ll block[MAXN];
int visit[MAXN];
int Find_Alloc(ll need,ll work[],int N,int visit[]){
int i,m_pos;
ll min;
min=LLONG_MAX;
m_pos=-1;
for(i=0;i<N;i++)
if(visit[i]==0)
if(work[i]>=need)
if(work[i]-need<min){
m_pos=i;
min= work[i]-need;
}
visit[m_pos]=1;
return m_pos;
} //找到合适的块并分配
int main(){
int T,N,M,i,pos;
ll need,space;
cin>>T;
while(T--){
cin>>N;
for(i=0;i<N;i++){
cin>>block[i];
visit[i]=0;
}
cin>>M;
for(i=0;i<M;i++){
cin>>need;
pos=Find_Alloc(need,block,N,visit);
space=block[pos];
if(i!=M-1){
if(pos!=-1)
cout<<space<<" ";
else
cout<<"NULL ";
}
else{
if(pos!=-1)
cout<<space<<endl;
else
cout<<"NULL"<<endl;
}
}
}
return 0;
}
链接:北邮OJ_内存分配
Problem.C 图像识别
思路
DFS的应用,注意visit的判断时机,一是在对每个结点调用DFS前进行一次判断,二是在DFS内部自我调用之前进行判断,以免对已经访问过的点调用DFS。
#include<iostream>
#include<math.h>
using namespace std;
#define MAXN 110
int graph[MAXN][MAXN];
int visit[MAXN][MAXN];
int addx[8]={-1,-1,-1,0,0,1,1,1};
int addy[8]={-1,0,1,-1,1,-1,0,1};
bool isdomain(int x1,int y1,int x2,int y2,int N,int M,int D){
if(x1<0||y1<0||x2<0||y2<0||x1>=N||y1>=M||x2>=N||y1>=M)
return false;
else if(abs(graph[x1][y1]-graph[x2][y2])<=D)
return true;
else
return false;
}
//深度优先搜索
void DFS(int x,int y,int N,int M,int D){
int adjx,adjy,i;
for(i=0;i<8;i++){
adjx=x+addx[i];
adjy=y+addy[i];
visit[x][y]=true;
if(!visit[adjx][adjy]&&isdomain(adjx,adjy,x,y,N,M,D))
DFS(adjx,adjy,N,M,D);
}
}
int main(){
int T,M,N,D,i,j,domain;
cin>>T;
while(T--){
cin>>N>>M>>D;
for(i=0;i<N;i++)
for(j=0;j<M;j++){
cin>>graph[i][j];
visit[i][j]=false;
}
domain=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++){
if(!visit[i][j]){//判断是否访问过是在主程序中体现的,而不是DFS函数
DFS(i,j,N,M,D);
domain++;
}
}
cout<<domain<<endl;
}
return 0;
}
链接:北邮OJ_图像识别
Problem.D 汇编
思路
我太菜了,没资格做这道题
链接:北邮OJ_汇编