PayPal2019春招實習生筆試題的題目

題目簡單描述:給你n個點的座標(x, y),均爲浮點數。node

若是任意兩個點之間的歐幾里得距離小於給定的一個浮點值,則認爲這兩個點之間有關聯,而且關聯具備傳遞性,總之就是儘量擴大一個集合。編程

輸入:網絡

d 歐式距離spa

n 用戶數code

接下來每一個用戶的座標。視頻

2.0
5
3.0 5.0
6.0 13.0
2.0 6.0
7.0 12.0
0.0 2.0blog

輸出:string

[[0, 2], [1, 3], [4]]it

 

實現:並查集的應用io

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <set>
#include <algorithm>
#include <vector>

using namespace std;

struct node
{
    double x, y;
}cur;

int fa[10000];

double disE(node A, node B)
{
    return ( fabs(A.x - B.x)*fabs(A.x - B.x) + fabs(A.y-B.y)*fabs(A.y-B.y) );
}

int findset(int x)
{
    return fa[x]!=x ? fa[x] = findset(fa[x]) : x;
}

int main()
{
    double dis;
    int n;
    scanf("%lf", &dis);
    scanf("%d", &n);

    vector<node>q;
    double a, b;

    for(int i=0; i<n; i++) {
        scanf("%lf %lf", &a, &b);
        cur.x = a;
        cur.y = b;
        q.push_back(cur);
    }
    for(int i=0; i<n; i++) {
        fa[i] = i;
    }

    dis = dis * dis;
    for(int i=0; i<q.size(); i++) {
        for(int j=0; j<q.size(); j++) {
            if(disE(q[i], q[j]) <= dis) {
                // fa[findset(j)] = findset(i);
                int xx = findset(i);
                int yy = findset(j);
                if(xx == yy)
                    continue;
                else if(xx < yy)
                    fa[yy] = xx;
                else if(xx > yy)
                    fa[xx] = yy;
            }
        }
    }

    for(int i=0; i<n; i++) {
        if(fa[i] != i)
            fa[i] = findset(fa[i]);
    }

    printf("[");
    bool first=true;

    for(int i=0; i<n; i++) {
        if(fa[i] == i) {
            if(first == false)
                printf(", ");
            first = false;
            printf("[");
            printf("%d", i);
            for(int j=i+1; j<n; j++) {
                if(fa[j] == i)
                    printf(", %d", j);
            }
            printf("]");
        }
    }
    printf("]\n");
    return 0;
}

 

[編程題] 彈幕

時間限制:2秒

空間限制:49152K

彈幕是現今網絡視頻常見的評論方式,可以反映一個視頻的火爆程度。假設某個時間一共有N條彈幕,每條彈幕i的持續時間爲兩個整數表示的時間區間(a[i],b[i]),咱們定義彈幕數量最多的一個時間段爲最精彩時段,求一個視頻的最精彩時段。


輸入描述:
第一行整數N,表明彈幕的條數,其中90%的 N < 1000000, 60%的N < 10000
第二行到第N+1行,是兩個整數(a[i],b[i]),表明每條彈幕的開始時間和結束時間, 請注意(a[i],b[i])是全開區間, 而且a[i], b[i] < 100

輸出描述:
M行,每行兩個整數(c,d),M是答案個數,(c,d)表明視頻最精彩時段的開始時間和結束時間,而且M個答案區間互不重疊。答案請按照開始時間從小到大輸出。請注意每行結尾應包含換行符,包括最後一行。

 輸入輸出的樣例參見牛客網的題目

經過的代碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <set>
#include <algorithm>
#include <vector>

using namespace std;
int f[1000001];
set<int>bound;
int main()
{
    int n;
    scanf("%d", &n);
    memset(f, 0, sizeof(f));
    while(n--) {
        int a, b;
        scanf("%d %d", &a, &b);
        bound.insert(a);
        bound.insert(b);
        for(int i=a+1; i<=b; i++)
            f[i]++;
    }
    int big = 0;
    for(int i=0; i<100; i++) {
        if(f[i] > big)
            big = f[i];
    }
    int left, right;
    for(int i=1; i<100; i++) {
        if(f[i] == big) {
            left = i-1;
            int j=i;
            while(f[j] == big && bound.find(j) == bound.end()) {
                j++;
            }
            right = j;
            // printf("***\n");
            printf("%d %d\n", left, right);
            i=j;
        }
    }
    return 0;
}
相關文章
相關標籤/搜索