NC229796. 一览众山小
描述
会当凌绝顶,一览众山小。
众所周知,光沿直线传播,如果两个点之间的光路被遮挡住就不能互相看见。
所以此题题意为:当你登上一个山峰时你能看见前后多少山峰呢。
Tip:你不一定只能向下看,你也可以向上看。
输入描述
第一行输入一个整数 ,表示山峰个数;
接下来 行,第 行 2个实数 ,表示第 座山峰的位置和高度(保证每个 都不相同);接下来输入一个整数 ,表示询问个数;接下来一行输入 个整数,表示询问登上了第几座山峰时能看见多少山峰。
输出描述
输出 行,每行一个正整数,表示每个询问的答案。
示例1
输入:
6 2 8 1 4 5 3 3 5 4 3 7 4 4 1 3 5 6
输出:
5 4 4 4
说明:
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; }