Advertisement

北航研究生复试机试真题-2012年

阅读量:

2012年北航机试真题

1、整数分解

某些整数能分解成若干个连续整数和的形式,例如:
15=1+2+3+4+5
15=4+5+6
15=7+8
某些整数不能分解为连续整数的和,例如16。
输入:一个整数N(N<10000)
输出:整数N对应的所有分解组合,按照分解组合中的最小整数从小到大输出,每个分解占一行,每个数字之间有一个空格(每行最后保留一个空格),如果没有任何分解组合,则输出NONE。

自测代码: 直接暴力解的,不确定会不会超时。

复制代码
    #include<iostream>
    #include<vector> 
    using namespace std;
    
    int main()
    {
    	int n;
    	cin>>n;
    	int i=1,flag=0;
    	while(i<=n/2)
    	{
    		int j=i+1,sum=n-i;
    		vector<int> rec;
    		rec.clear();
    		rec.push_back(i);
    		while(sum>0)
    		{
    			sum=sum-j;
    			rec.push_back(j);
    			j++;
    		}
    		if(sum==0)
    		{
    			//i=j;
    			cout<<n<<" = "<<*rec.begin();
    			for(int k=1;k<rec.size();k++)
    			{
    				cout<<" + "<<rec[k];
    			}
    			cout<<endl;
    			flag=1;
    		}
    		i++;
    	}
    	if(flag==0) cout<<"NONE";
    	return 0;
    } 
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

2、小岛面积

1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵中的1代表海岸线,0代表小岛,求小道面积。
即仅求这样的0。该0在行中被两个1包围,该0在列中被两个1包围。

样例:

复制代码
    样例输入:		
    6		
    1 1 1 1 1 1		
    1 1 0 0 0 1		
    1 0 0 0 1 0		
    1 1 0 1 1 1		
    0 1 0 1 0 0 		
    1 1 1 1 1 1	
    样例输出:(不能完全被1围住的0不算)		
    8
    
    
      
      
      
      
      
      
      
      
      
      
    

思路: 确定一个最大的圈,用一圈1包围尽可能多的0。边界确定后直接计算在里面的0的数量即可。

自测代码:

复制代码
    #include<iostream>
    using namespace std;
    
    const int N=1010;
    
    int land[N][N];
    
    pair<int,int> row[N],col[N];
    
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			cin>>land[i][j];
    	for(int i=0;i<n;i++)
    	{
    		row[i].first=n;
    		row[i].second=-1;
    		col[i].first=n;
    		col[i].second=-1;
    	}
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			if(land[i][j] == 1)
    			{
    				if(row[i].first == n) row[i].first=j;
    				else row[i].second=j;
    				if(col[j].first == n) col[j].first=i;
    				else col[j].second=i;
    			}
    	int res=0;
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    		{
    			if(land[i][j] == 0)
    			{
    				if(i>col[j].first && i<col[j].second && j>row[i].first && j<row[i].second)
    				res++;
    			}
    		}
    	cout<<res;
    	return 0;
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

3.统计关键字的出现位置

输入:一行标准的c语言代码(字符数小于300),统计出该字符串中关键字的if,while,for所在的位置,按照关键字出现的顺序依次输出,注意双引号内的不需要统计。输出格式为:关键字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。
样例输出:
if:43
while:88
if:133
if:170

思路: 直接扫描比对。

全部评论 (0)

还没有任何评论哟~