NC208617. 看星星
描述
现在有n个用来观看星星的天文台,每个天文台有个高度h[i]。现在有m条路连接n个天文台,每一条路连接两个不同的天文台。
一个天文台被称为不好的天文台当且仅当它附近的天文台都比他高,这里定义 "附近的天文台" 为跟它有一条直接相连的路的天文台。
问有多少个不好的天文台?
输入描述
第一行输入n、m
接下来一行n个数,代表每个天文台的高度h[i]
接下来m行 每行两个整数u、v 代表u和v之间有一条路相连
输出描述
一行答案
示例1
输入:
4 3 1 2 3 4 1 3 2 3 2 4
输出:
2
说明:
【数据范围及约定】
2<=n<=10^5
1<=m<=10^5
1<=h[i]<=10^9
1<=u,v<=n
u!=v
可能存在两个天文台有多条路
单独的一个天文台没有路连接其他的天文台也是不好的天文台
Java(javac 1.8) 解法, 执行用时: 579ms, 内存消耗: 152408K, 提交时间: 2020-09-04 09:29:26
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int m=in.nextInt(); int[] h=new int[n+1]; int[] v=new int[n+1]; for(int i=1;i<=n;i++) { h[i]=in.nextInt(); } for(int i=0;i<m;i++) { int l=in.nextInt(); int r=in.nextInt(); if(h[l]>h[r]) { v[l]=1; } else { v[r]=1; } } int sum=0; for(int i=1;i<=n;i++) { if(v[i]==0) sum++; } System.out.println(sum); } }
C++14(g++5.4) 解法, 执行用时: 59ms, 内存消耗: 1656K, 提交时间: 2020-07-04 15:17:33
#include<bits/stdc++.h> using namespace std; class tai { public: int w; int lt; int x; }; tai sz[100005]; int main() { int a,b; scanf("%d %d",&a,&b); for(int i=1;i<=a;i++) { scanf("%d",&sz[i].w); } for(int i=1;i<=b;i++) { int x,y; scanf("%d %d",&x,&y); if(sz[x].w>sz[y].w) { sz[y].x++; }else if(sz[x].w<sz[y].w) { sz[x].x++; } sz[y].lt++; sz[x].lt++; } int sum=0; for(int i=1;i<=a;i++) { if(sz[i].lt==sz[i].x || sz[i].lt==0) { sum++; } } printf("%d\n",sum); }
C++11(clang++ 3.9) 解法, 执行用时: 190ms, 内存消耗: 8024K, 提交时间: 2020-09-15 19:46:52
#include<bits/stdc++.h> using namespace std; vector<int>v[100010]; int n,m; int h[100010]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>h[i]; for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; v[a].push_back(b),v[b].push_back(a); } int num=0; for(int i=1;i<=n;i++) { bool flag=1; auto it=v[i].begin(); for(;it!=v[i].end();it++) { if(h[*it]<=h[i]) flag=0; } if(flag) num++; } cout<<num<<endl; return 0; }