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;
}