P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)
如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。
P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)
如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。
第一行输入点集的个数 N, 接下来 N 行,每行两个数字代表点的 X 轴和 Y 轴。 对于 50%的数据, 1 <= N <= 10000; 对于 100%的数据, 1 <= N <= 500000;
输出“最大的” 点集合, 按照 X 轴从小到大的方式输出,每行两个数字分别代表点的 X 轴和 Y轴。
5 1 2 5 3 4 6 7 5 9 0
4 6 7 5 9 0
//按照y值从大到小排序,然后扫描,保存当前最大的x,如果该点比x大,那么该点满足条件
//注意要使用scanf,printf,使用cin,cout会超时
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
int x;
int y;
};
bool cmp(node n1, node n2){
return n1.y>n2.y;
}
node no[500001];
int main(){
int n;
while(scanf("%d", &n)!=EOF){
for(int i = 0; i < n; i++)
{
scanf("%d%d", &no[i].x, &no[i].y);
}
sort(no,no+n,cmp);
int mmax = -1;
for(int i = 0; i < n; i++)
{
if(no[i].x>mmax)
{
mmax=no[i].x;
printf("%d %d\n", no[i].x ,no[i].y);
}
}
}
return 0;
}
一个点右上方没有点,也就是一个点右边的点全都在它的下边。
所以我们将点按照横坐标从左到右排序,从右开始扫,找出右边点最大纵坐标。
那么一个点的纵坐标比右边的点纵坐标最大值还大,就说明这个点右边的点全在它的下面。
这样选择点就可以选出所有符合条件的点了。
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pr make_pair
#define fi first
#define se second
const int MAX_N = 5e5 + 5;
typedef pair<int, int> pii;
vector<pii> p;
pii ans[MAX_N];
int main() {
int n, x, y, num, limit;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
p.pb(pr(x, y));
}
sort(p.begin(), p.end());
num = 0, limit = -1;
for (int i = n - 1; i >= 0; i--) {
if (p[i].se > limit) {
ans[num] = p[i];
num++;
limit = p[i].se;
}
}
for (int i = num - 1; i >= 0; i--) {
printf("%d %d\n", ans[i].fi, ans[i].se);
}
return 0;
}
C++ //倒序查找法,通过率100% //暴力破解法,因为超时,通过率只到60%, #include<iostream>
#include<vector>
#include<algorithm>
usingnamespacestd;
intmain()
{
intN;
cin >> N;
intx, y;
vector<pair<int, int>>point(N);
for(inti = 0; i < N; i++)
{
cin >> x >> y;
point[i] = make_pair(x,y);
}
sort(point.begin(),point.end());
//倒序查找法100%
intMax=point[N-1].second;
vector<int>a(N);
a[N-1]=1;
for(inti=N-2;i>=0;i--)
{
if(point[i].second>Max)
a[i]=1;
Max=max(point[i].second,Max);
}
for(inti=0;i<N;i++)
{
if(a[i]==1)
cout<<point[i].first<<" "<<point[i].second<<endl;
}
//暴力破解,超时,60%
//for (int i = 0; i < N-1; i++)
//{
// int n = 1;
// for (int j = i+1; j < N; j++)
//{
// if (point[i].second < point[j].second)
// {
// n = 0;
// break;
// }
// }
// if (n == 1)
// cout << point[i].first<<" " << point[i].second << endl;
//}
//cout << point[N-1].first<<" " << point[N-1].second << endl;
return0;
}
|
import sys
if __name__=="__main__":
N = sys.stdin.readline().strip('\n')
N = int(N)
P = []
output = []
for i in range(N):
x,y = sys.stdin.readline().strip('\n').split(' ')
P.append([int(x),int(y)])
P.sort(reverse=True)
MAXX = 0
MAXY = 0
for m,n in P:
if m > MAXX or n > MAXY:
MAXX = m
MAXY = n
output.append([m, n])
output.sort()
for m,n in output:
print(m,n)
#include<bits/stdc++.h>
using namespace std;
bool cmp(const pair<int, int> &a,const pair<int, int> &b){
return a.first>b.first;
}
int main(){
int n;
while(EOF != scanf("%d", &n)){
vector<pair<int,int>> arr;
for(int i=0,x,y;i<n;++i){
scanf("%d %d", &x, &y);
arr.emplace_back(x,y);
}
sort(arr.begin(),arr.end(),cmp);
vector<pair<int,int>> ans;
for(int i=0,maxNum;i<n;++i){
if(arr[i].second>maxNum){
ans.push_back(arr[i]);
maxNum=arr[i].second;
}
}
for(auto it=ans.rbegin();it!=ans.rend();++it){
printf("%d %d\n", it->first, it->second);
}
}
return 0;
} #include<iostream>
#include<algorithm>
using namespace std;
int main() {
bool cmp(int *p, int *q);
int eNum = 0;
scanf("%d", &eNum);
int** samples;
samples = new int*[eNum];
for (int i = 0; i < eNum; i++) {
samples[i] = new int[2];
scanf("%d %d", &samples[i][0], &samples[i][1]);
}
sort(samples, samples + eNum,cmp);
int max = samples[eNum - 1][0];
for (int i = eNum - 1; i >= 0; i--) {
if (samples[i][0] >= max) {
printf("%d %d\n", samples[i][0], samples[i][1]);
max = samples[i][0];
}
}
}
bool cmp(int *p, int *q)
{
return p[1] < q[1];
} /*
* 更新一个cout不超时的版本 ~=~
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct point
{
int x;
int y;
};
bool compare(struct point x, struct point y)
{
return x.y > y.y;
}
int main()
{
int N;
while (cin >> N)
{
int x = 0, y = 0, tmp = 0;
vector<struct point> vc;
for (auto i = 0; i < N; i++)
{
struct point p;
cin >> x >> y;
p.x = x, p.y = y;
vc.push_back(p);
}
sort(vc.begin(), vc.end(), compare);
tmp = vc[0].x;
for (auto i = 0; i < vc.size(); i++)
{
if (tmp <= vc[i].x)
{
tmp = vc[i].x;
cout << vc[i].x << " " << vc[i].y << '\n';
}
}
}
return 0;
} import sys points = [] for line in sys.stdin: lin = line.split() if len(lin)==1: continue else: points.append((int(lin[0]),int(lin[1]))) points.sort(reverse=True, key=lambda x:x[1]) #res.append(nums[0]) flag_x = points[0][0] print(str(points[0][0])+' '+str(points[0][1])) for p in points: if p[0]>flag_x: #res.append(p) print(str(p[0])+' '+str(p[1])) flag_x = p[0] else: continue #只能通过80%,有大神帮忙瞅一眼吗?超内存。。
时间复杂度为O(nlogn) 只通过60%
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
int[][] arr = new int[n][2];
for (int i = 0; i < n; i++) {
String[] line = scan.nextLine().split(" ");
arr[i][0] = Integer.parseInt(line[0]);
arr[i][1] = Integer.parseInt(line[1]);
}
// 按x的坐标从小到大排序
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]);
ArrayList<int[]> list = new ArrayList<>();
// 使用动态规划从后往前
int last_max = -1; // 记录当前下标后面的最大值
for (int i = n - 1; i >= 0; i--) {
// 如果后面的y值没有大于当前y值的就添加进去
if (arr[i][1] > last_max) list.add(0, arr[i]);
last_max = Math.max(last_max, arr[i][1]); // 更新最大值
}
for (int[] temp : list) {
System.out.println(temp[0] + " " + temp[1]);
}
}
} #include "iostream"
#include "stdio.h"
#include "algorithm"
using namespace std;
struct point{
int x,y;
}p[500001];
int cmp1(const point &a,const point &b){
return a.y > b.y;
}
int main(){
int n,i,j,x,y;
scanf("%d",&n);
for(i = 0;i < n; i++)
scanf("%d %d",&p[i].x,&p[i].y);
sort(p,p+n,cmp1);
int Max = p[0].x;
printf("%d %d\n",p[0].x,p[0].y);
for(i = 0;i < n; i++){
if(p[i].x > Max){
Max = p[i].x;
printf("%d %d\n",p[i].x,p[i].y);
}
}
return 0;
} #include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
struct point
{
int x, y;
};
int n, cnt;
point pts[MAXN];
point res[MAXN];
bool cmp(const point &a, const point &b)
{
return a.x < b.x;
}
void solve()
{
sort(pts, pts + n, cmp);
res[0] = pts[n - 1];
int mx = res[0].y;
cnt = 1;
for (int i = n - 2; i >= 0; i--)
{
if (pts[i].y >= mx)
{
res[cnt++] = pts[i];
mx = pts[i].y;
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &pts[i].x, &pts[i].y);
}
solve();
for (int i = cnt - 1; i >= 0; i--)
{
printf("%d %d\n", res[i].x, res[i].y);
}
return 0;
}
// 为啥下面代码一个用例都过不了呢,求解
package main
import (
"fmt"
"bufio"
"os"
"strings"
"strconv"
)
func main() {
sc := bufio.NewScanner(os.Stdin)
bs := make([]byte, 1024 * 1024 * 64)
sc.Buffer(bs, len(bs))
for k := 0; k < 10; k ++ {
sc.Scan()
n, _ := strconv.Atoi(sc.Text())
nums := make([]int, n)
sc.Scan()
line2 := strings.Fields(sc.Text())
for i, l2 := range line2 {
nums[i], _ = strconv.Atoi(l2)
}
maxV := 0
for i, cur := range nums {
sum := cur
for j := i-1; j >= 0; j -- {
if nums[j] >= cur {
sum += nums[j]
} else {
break
}
}
for j := i+1; j < n; j ++ {
if nums[j] >= cur {
sum += nums[j]
} else {
break
}
}
maxV = max(maxV, cur * sum)
}
fmt.Println(maxV)
}
}
func max(a, b int) int {
if a > b {
return a
}
return b
} 有没有人帮我解释一下呀😭😭 # def jihe() num = int(input()) jihe = [] for n in range(0,num): l = list(map(int,input().split())) jihe.append(l) # print(jihe) jihe1 = jihe[:] for i in jihe1: for j in jihe1: if j[0]>i[0] and j[1]>i[1]: jihe.remove(i) break # print(jihe) for a in jihe: print(a[0],a[1])
# name:LH # 2022/4/2 13:00 point = [] refer_num = 0 while True: str_re = input('请输入参照数字(要求为正整数,n或N退出):') if str_re == 'n'&nbs***bsp;str_re == 'N': break else: try: int_re = int(str_re) except Exception as re_err: print(f'{re_err}\n输入有误,请重新输入!') else: refer_num = int_re break while True: str_p = input('请输入坐标点的横坐标x和纵坐标y(要求:1、横纵坐标都为正整数;' '2、x y使用英文","间隔;3、回车确认;4、输入n或N并回车->结束。' '(示例:5,7)\n请输入:') if str_p == 'n'&nbs***bsp;str_p == 'N': break else: try: temp = str_p.split(',', 1) temp[0] = int(temp[0]) temp[1] = int(temp[1]) except Exception as p_err: print(f'{p_err}\n输入有误,请重新输入!') continue else: point.append(temp) finally: print('*'*120) point.sort() max_point = [] i = 0 while i < len(point): if point[i][0] > refer_num&nbs***bsp;point[i][1] > refer_num: max_point.append(point[i]) i += 1 print(max_point)