列表

详情


NC229796. 一览众山小

描述

会当凌绝顶,一览众山小。

众所周知,光沿直线传播,如果两个点之间的光路被遮挡住就不能互相看见。

所以此题题意为:当你登上一个山峰时你能看见前后多少山峰呢。

Tip:你不一定只能向下看,你也可以向上看。

输入描述

第一行输入一个整数 ,表示山峰个数;
接下来  行,第  行  2个实数 ,表示第  座山峰的位置和高度(保证每个  都不相同);
接下来输入一个整数 ,表示询问个数;
接下来一行输入q 个整数,表示询问登上了第几座山峰时能看见多少山峰。

输出描述

输出 q 行,每行一个正整数,表示每个询问的答案。

示例1

输入:

6
2 8
1 4
5 3
3 5
4 3
7 4
4
1 3 5 6

输出:

5
4
4
4

说明:

对于输入的第一个询问,第一座山峰在  处,通过橙色的视线可以看到其他所有5座山峰,故该询问的答案为5。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 188ms, 内存消耗: 19852K, 提交时间: 2022-03-07 23:25:15

import java.io.*;
import java.util.*;
public class Main {
	static int []a = new int [1004];
	static int []b = new int [1003];
	static int n = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner (System.in);
		n = sc.nextInt();
		for (int i = 1 ; i <= n ; i++) {
			a[i] = sc.nextInt();
			b[i] = sc.nextInt();
		}
		int q = sc.nextInt();
		while (q-->0) {
			int x = sc.nextInt();
			int cont = 0;
			for (int i = 1 ; i <=n ; i++) {
				if (i != x && check(i,x)) cont++;
			}
			System.out.println(cont);
		}
	}
	
	static boolean check(int x , int y) {
		for (int i = 1 ; i <= n ; i++) {
			if (a[i] <= Math.min(a[x], a[y]) || a[i] >= Math.max(a[x], a[y])) continue;
			double h = (b[x]-b[y])*(a[i]-a[x])*1.0/(a[x]-a[y]) +b[x];
			if (b[i]>=h) return false;
		}
		return true;
	}
}

C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 396K, 提交时间: 2022-08-13 23:47:23

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n;
int pt(int x,int y){
    for(int i=1;i<=n;i++){
        if(a[i]<=min(a[x],a[y])||a[i]>=max(a[x],a[y]))continue;
        double h=(a[i]-a[x])*(b[y]-b[x])*1.0/(a[y]-a[x])+b[x];
        if(b[i]>=h)return 0;
    }
    return 1;
    
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
    int q;
    cin>>q;
    while(q--){
        int x;
        cin>>x;
        int cn=0;
        for(int i=1;i<=n;i++){
            if(x!=i&&pt(x,i))cn++;
        }
        cout<<cn<<endl;
    }
    
    
    return 0;
}

C++ 解法, 执行用时: 6ms, 内存消耗: 400K, 提交时间: 2021-12-02 14:49:31

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n;
int pt(int x,int y)
{
	for(int i=1;i<=n;i++)
	{
		if(a[i]<=min(a[x],a[y])||a[i]>=max(a[x],a[y]))
		continue;
		double h=(a[i]-a[x])*(b[y]-b[x])*1.0/(a[y]-a[x])+b[x];
		if(b[i]>=h)
		return 0;
	}
	return 1;
 } 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i]>>b[i];
	int q;
	cin>>q;
	while(q--)
	{
		int x;
		cin>>x;
		int cn=0;
		for(int i=1;i<=n;i++)
		{
			if(x!=i&&pt(x,i))
			cn++;
		}
		cout<<cn<<endl;
	}
	return 0;
}

上一题