您的位置:首页 > 其它

2018今日头条一笔总结

2017-08-23 12:41 190 查看
第1题:

P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

class Point implements Comparable<Point>{
int x;
int y;
@Override
public int compareTo(Point o) {
// TODO Auto-generated method stub
if(this.x== o.x){
return this.y-o.y;
}
return this.x-o.x;
}

}
public class Main1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n= scan.nextInt();
Point[] ps = new Point
;
for(int i=0; i< n; i++){
ps[i]= new Point();
ps[i].x= scan.nextInt();
ps[i].y= scan.nextInt();
}
Arrays.sort(ps);
int maxy = ps[n - 1].y;
ArrayList<Integer> v1 = new ArrayList<Integer>();
ArrayList<Integer> v2 = new ArrayList<Integer>();

for (int i = n - 1; i >= 0; i--) {
//x轴上x最大的肯定是最大点
if (i == n - 1) {
v1.add(ps[i].x);
v2.add(ps[i].y);
}
//如果当前点的y小于最大的y,那么肯定不是最大点
else if (ps[i].y < maxy) continue;
//当前点的大于等于最大点,这种也是最大点
else if (ps[i].y >= maxy) {
maxy = ps[i].y;
v1.add(ps[i].x);
v2.add(ps[i].y);
}
}
for (int i = v1.size() - 1; i >= 0; i--) {
System.out.println(v1.get(i)+" "+ v2.get(i));
}
//6 1 2 2 4 4 6 4 3 7 5 9 0
scan.close();
}

第2题:
 给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。

暴力解超时,只能通过30%。并且要注意用long,因为乘积的原因,integer应该会越界

public class Main22 {
public static long ans;
public static long anss;
public static void dfs(int[] a, int start, int end) {
if (start > end) return ;
if (start == end) {
long anss = a[start] * a[start];
if (anss > ans) ans = anss;
return ;
}
long sum = 0;
long minn = 1000000;
int flag = -1;
for (int i = start; i <= end; i++) {
if (a[i] < minn) {
minn = a[i];
flag = i;
}
sum += a[i];
}

long anss = sum * minn;
if (anss > ans) ans = anss;
dfs(a, start, flag - 1);
dfs(a, flag + 1, end);
return ;
}
public static void main(String[] args) {

Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] a = new int
;
long sum =0;
int min= Integer.MAX_VALUE;
int flag = -1;
//其实就是遍历了一遍找到了最小值,计算了一下最小值×整个区间的乘积
for (int i = 0; i < n; i++) {
a[i]= scan.nextInt();
sum += a[i];
if (a[i] < min) {
min = a[i];
flag = i;
}
}
ans = sum * min;
//以当前区间最小值为界限进行划分,成了两个子区间,分别对两个子区间进行递归操作,递归操作与上面的过程类似
dfs(a, 0, flag - 1);
dfs(a, flag + 1, n - 1);
System.out.println(ans);
scan.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: