2019校招 360笔试编程

2018.8.27 360笔试 编程三道

题目一: 算正方形面积

n行 每行一个坐标 ,求坐标点所在最大正方形面积
样例输入
2
0 0
2 2 
样例输出
4

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    long x=0,y=0;
    long x1=1e9;
    long x2=-x1;
    long y1=x1;
    long y2=x2;
    for(int i =0;i<n;i++){
        long x,y;
        cin>>x>>y;
            x1 = min(x1,x);
            x2 = max(x2,x);
            y1 = min(y1,y);
            y2 = max(y2,y);
    }
    long ans = max(abs(x1-x2),abs(y1-y2));
	cout  << ans*ans<<endl;
	return 0;
}

题目二:看花

n天,m种花,每天看一种花,记录a[i],问在[i,j]天区间看了几种花

输入

第一行 n m 5 3
第二行 a[i] 1 2 3 2 2
第三行 q 3
第四行 i j 1 4
  i j 2 4
  i j  1 5

输出

3 2 3

思路:利用list切片 放入set去重(c++和python超时,ace57% java可以全部ace)

import sys
n,m=input()
n=int(n)

line=input().split()
line=list(map(int,line))

q=int(input())
while (q>0):
    q=q-1
    i,j=input().split()
    i=int(i)
    j=int(j)
    print(len(set(line[i-1:j])))

题目三:满足条件的最长子序列

小红有两个长度为n的排列A和B。每个排列由[1,n]数组成,且里面的数字都是不同的。
现在要找到一个新的序列C,要求这个新序列中任意两个位置(i,j)满足:
如果在A数组中C[i]这个数在C[j]的后面,那么在B数组中需要C[i]这个数在C[j]的前面。
请问C序列的长度最长为多少呢?
输入
第一行一个整数,表示N。
第二行N个整数,表示A序列。
第三行N个整数,表示B序列。
满足:N<=50000
输出
输出最大的长度
样例输入
5
1 2 4 3 5
5 2 3 4 1
样例输出
2

#include<bits/stdc++.h>
using namespace std;
#define MAXN 50010
const int INF = 1e9;
int idx[MAXN];
int b[MAXN];
int a;
int dp[MAXN];
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>a;
        idx[a-1] = i;
    }
    for(int i=0; i<n; i++){
        cin>>a;
        b[i] = idx[a-1];
        dp[i] = INF; // 初始化为无限大
    }
    //最长递增子序列
    int pos = 0;  // 记录dp当前最后一位的下标
    dp[0] = b[0]; // dp[0]值显然为a[0]
    for (int i = 1; i < n; i++) {
        if (b[i] > dp[pos]) // 若a[i]大于dp数组最大值,则直接添加
            dp[++pos] = b[i];
        else // 否则找到dp中第一个大于等于a[i]的位置,用a[i]替换之。
            dp[lower_bound(dp, dp + pos + 1, b[i]) - dp] = b[i]; // 二分查找
    }
    printf("%d\n", pos+1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/behboyhiex/article/details/82120603