商汤科技2018校招研究员笔试第一场

https://www.nowcoder.com/test/11960206/summary

题目1

铁柱在研究一个区域的小黄车使用分布。他得到了服务器上最近10000个用户的二维位置,现在他想把这些用户聚成K(K<10) 组,每组有一个中心C_i。他想评价聚类算法的好坏,把每个数据点到中心的l1距离作为总距离。即
D = sum_j || X_j - C( X_j ) ||_1
其中C(X_j)代表X_j所属的中心。现在他想找一个尽可能好的聚类算法,使得这个总距离尽可能小。要求你输出K个中心的位置(顺序不限)
比如如果有5个数据点

1 1
1 2
1 4
3 4
3 5

给定2个中心1 2, 3 4的话
总距离就是1+0+2+0+1 = 4

解答

kmeans,只过了 23%的样例

points = []
point_num = 10000
max_iter = 100
K = int(input())
for i in range(point_num):
    line = input().strip().split()
    points.append([float(line[0]), float(line[1])])
 
centers = [points[i] for i in range(K)]
label = [-1 for i in range(10000)]
flag = True
 
def distance(p1, p2):
    return abs(p1[0]-p2[0]) + abs(p1[1]-p2[1])
 
 
now_iter = 0
while now_iter < max_iter:
    now_iter += 1
    group = [[] for i in range(K)]
    for i in range(point_num):
        min_dis, target = 999999, -1
        for center_ind, center in enumerate(centers):
            dis = distance(center, points[i])
            if  dis< min_dis:
                min_dis, target = dis, center_ind
        group[target].append(points[i])
    for i in range(K):
        ps = group[i]
        xs = [p[0] for p in ps]
        ys = [p[1] for p in ps]
        x = sum(xs) / len(xs)
        y = sum(ys) / len(ys)
        centers[i] = [x, y]
for i in range(K):
    print('{} {}'.format(centers[i][0], centers[i][1]))

题目2

研究地球空间科学的永强想研究海岸线的长度和海岸线面积之间的关系,为此他找来了很多航拍图像。在航拍图像上利用图像分割的方法,把图像的每个像素标记成陆地(1)和水面(0)。
现在永强想知道每张图中陆地部分的面积。

已知每张图最底部的一条边都是陆地,并且在一张图上陆地都是四邻域联通的。

但是永强发现分割的结果有很多的噪声,于是他定义了如下规则试图去除噪声:
a) 如果一个水面区域被陆地包围,则将这个区域记为陆地;
b) 在a的基础上如果一个陆地区域不和底边的陆地相连,那么这是一个岛屿,不计入陆地的面积。

解答

内存超了,只过了92%的数据,懒得进行优化了,思路应该是正确的。

#include <iostream>
using namespace std;
int m, n, land=0;
int board[1000][1000];
 
void label(int x, int y, int raw, int color)
{
    
    
    land += 1;
    board[x][y] = color;
    if(x>=1 && board[x-1][y]==raw)
        label(x-1, y, raw, color);
    if(x<m-1 && board[x+1][y]==raw)
        label(x+1, y, raw, color);
    if(y>0 && board[x][y-1]==raw)
        label(x, y-1, raw, color);
    if(y<n-1 && board[x][y+1]==raw)
        label(x, y+1, raw, color);
}
 
int main()
{
    
    
    cin >> m >> n;
    for(int i=0;i<m;i++)
    {
    
    
        for(int j=0;j<n;j++)
        {
    
    
            cin>>board[i][j];
        }
    }
     
    // 将海洋连接到一起,且全标成-2
    for(int col=0;col<n;col++)
    {
    
    
        if(board[0][col] == 0)
            label(0, col, 0, -1);
    }
    // 标记两侧的海洋
    for(int row=0;row<m;row++)
    {
    
    
        if(board[row][0] == 0)
            label(row, 0, 0, -1);
        if(board[row][n-1] == 0)
            label(row, n-1, 0, -1);
    }
    // 其余的海洋是地中海,标记为陆地
    for(int i=0;i<m;i++)
    {
    
    
        for(int j=0;j<n;j++)
        {
    
    
            if(board[i][j] == 0)
                board[i][j] = 1;
        }
    }
    // 计算陆地面积。此时海中地已经被-1所包围,所以不用担心会计算在内
    land = 0;
    for(int col=0;col<n;col++)
    {
    
    
        if(board[m-1][col] == 1)
        {
    
    
            label(m-1, col, 1, 2);
            break;
        }
    }
    cout << land << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/pku_Coder/article/details/88095719
今日推荐