列表

详情


NC21607. 牛牛家的房子

描述

城市有n排n列的房子。牛牛在每个格点(x,y)[0≤ x,y ≤ n]建了一所房子,冬天来了,(x, y)的室内温度为t[x*n + y]度。从(x1, y1)处的房子移动到(x2, y2)处的房子需要|x1 - x2| + |y1 - y2|分钟。此外,外面很冷,一个人最多只能在外面呆上r分钟。最初每个房子里只住一个人。然后每个人重复下面的过程:他们在一次旅行中找到他们能到达的最温暖的房子,然后搬到那里。人们重复这个动作,直到在离开他们当前的房子的r分钟内没有更温暖的房子。算出两个值:

- a = 当每个人都停止移动时,容纳至少一个人的房屋数量
- b = 同一所房子的最大人数

输入描述

第一行输入两个整数n,r (1 ≤ n ≤ 20, 1 ≤ r ≤ 40 )
接下来n行每行输入n个整数 表示每个房子的温度,范围在[1,1000]内

输出描述

输出一行,包含两个整数用空格隔开

示例1

输入:

3 1
9 1 6
5 3 2
7 4 8

输出:

4 4

示例2

输入:

3 2
9 1 6
5 3 2
7 4 8

输出:

2 6

示例3

输入:

3 7
9 1 6
5 3 2
7 4 8

输出:

1 9

示例4

输入:

7 3
59 22  2 17 77 43 67 
16 49 51 46 61  4  9 
42 12 80 82 24 29  1 
27 63 65 26 10 28 83 
 7 73  8 47 37 23 38 
75 54 71 58 78 21 45 
35 81 48 41 44 52 32

输出:

5 20

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 35ms, 内存消耗: 424K, 提交时间: 2023-08-11 16:06:52

#include<bits/stdc++.h>
using namespace std;
int t[25][25];
int p[25][25];
int n,r,ans,cnt; 
void check(int x,int y){
	//寻找能到达的,温度最高的地方
	int maxx=x,maxy=y;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(abs(x-i)+abs(y-j)<=r && t[i][j]>t[maxx][maxy]){
				maxx=i;maxy=j;//更新位置 
			}
		}
	}
	if(maxx!=x || maxy!=y){
		p[maxx][maxy]+=p[x][y];//人数转移
		p[x][y] = 0;//原点清空
		check(maxx,maxy);//寻找下一个点 
	} 
}
int main(){
	cin>>n>>r;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>t[i][j];
			p[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			check(i,j);//每个人都寻找自己能到的最温暖的地方 
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans = max(ans,p[i][j]);
			if(p[i][j])cnt++;
		}
	} 
	cout<<cnt<<" "<<ans<<endl;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 496K, 提交时间: 2019-08-16 15:44:05

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,r,t[30][30];
struct k
{
	int x,y,m;
}p[405];
bool operator <(const struct k &a,const struct k &b)
{
	return t[a.y][a.x]<t[b.y][b.x];
}
int main()
{
	cin>>n>>r;
	int f=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>t[i][j];
			p[f].m=1;
			p[f].x=j;
			p[f].y=i;
			f++;
		}
	}
	sort(p,p+f);
	int a=0,maxn=0;
	for(int i=0;i<f;i++)
	{
		for(int j=f-1;j>i;j--)
		{
			if(abs(p[j].x-p[i].x)+abs(p[j].y-p[i].y)<=r)
			{
				p[j].m+=p[i].m;
				p[i].m=0;
				break;
			}
		}
		if(p[i].m)
		a++;
	}
	for(int i=0;i<f;i++)
	{
		maxn=max(p[i].m,maxn);
	}
	cout<<a<<" "<<maxn;
}
 

上一题