NC21607. 牛牛家的房子
描述
输入描述
第一行输入两个整数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; }